# New client intake

> Start working with a studio as a new client: contact details, company and project start (a demo client intake).

A few details so we can prepare for our first call.

This is a form you can fill in for a person without opening a browser. Its fields are `contact_name`, `email`, `phone`, `contact_method`, `company_address`, `company_website`, `project_start`, `documents` (`contact_name`, `email`, `phone`, `contact_method`, `company_address`, `company_website`, `project_start` required). Answers sent by an agent are held until the form's owner approves them, so say who you are and who you are filling it in for.

**Only send what your person told you. Ask them for any required answer you do not have, and never tick a consent box or answer a demographic question for them unless they told you to.**

## How to fill it

1. **If you can send HTTP requests:** `POST https://ui.usecube.io/f/client-intake` with a JSON body `{"answers": {...}, "agent": {"name": "...", "model": "..."}, "on_behalf_of": "..."}`. Details below.
2. **If you have the Cube MCP connector** (`https://ui.usecube.io/mcp`): call `submit_form` with `id: "client-intake"`, `answers` and `on_behalf_of`; or `prefill_link` with `id` and `answers` to get the link for your person (a file cannot ride in it; they attach it on the page).
3. **If you can't do either (a chatbot):** give your person this link with the answers filled in, each one URL-encoded (lists and objects as JSON). They check it and press Submit themselves:

   ```
   https://ui.usecube.io/f/client-intake#contact_name=...&email=...&phone=...&contact_method=...&company_address=...&company_website=...&project_start=...
   ```

   For example: https://ui.usecube.io/f/client-intake#contact_name=Jane%20Doe&email=jane%40example.com&phone=%2B14155550123&contact_method=%5B%22Email%22%5D&company_address=%7B%22street%22%3A%221%20Main%20St%22%2C%22city%22%3A%22Seattle%22%2C%22region%22%3A%22WA%22%2C%22postal_code%22%3A%2298101%22%2C%22country%22%3A%22US%22%7D&company_website=https%3A%2F%2Fexample.com&project_start=2026-11-02

## Fields

- **contact_name** (string, up to 200 characters, required): The person the studio works with.
- **email** (string, email, required): The contact's email address.
- **phone** (string, E.164 phone number like +14155550123, required): The contact's phone number.
- **contact_method** (array of strings, any of "Email", "Phone call", "Text message", "Video call", required): How the contact likes to be reached.
- **company_address** (object {street, city, region, postal_code, country: ISO 3166-1 alpha-2 code like "US"}, required): The company's mailing address.
- **company_website** (string, URL, required): The company's website.
- **project_start** (string, ISO date YYYY-MM-DD, required): When the client wants the project to start.
- **documents** (file, PDF or Word (.doc) file or Word file or PNG or JPEG or WebP or GIF up to 20 MB): A brief or any document the client wants to share. If the file is on your person's computer and you can run commands, POST it as multipart; if you cannot, call the MCP tool `prefill_link` (or build the link below) and give your person the link: they attach the file on the page and press Submit. A file goes in one of three ways: (1) a multipart/form-data POST with the part `documents` (and the other answers as JSON in the part `answers`); (2) in JSON as {"name": "resume.pdf", "type": "application/pdf", "base64": "..."}, only for a small file you already hold, never by reading a file into your context; (3) in JSON as {"url": "https://..."}, a public https link the form downloads. At most 10 MB a file, 50 MB in all; the bytes are checked, not the name.

## Submit over HTTP

`POST https://ui.usecube.io/f/client-intake` with `Content-Type: application/json`:

```json
{
  "answers": {
    "contact_name": "Jane Doe",
    "email": "jane@example.com",
    "phone": "+14155550123",
    "contact_method": [
      "Email"
    ],
    "company_address": {
      "street": "1 Main St",
      "city": "Seattle",
      "region": "WA",
      "postal_code": "98101",
      "country": "US"
    },
    "company_website": "https://example.com",
    "project_start": "2026-11-02"
  },
  "agent": {
    "name": "Claude",
    "model": "claude-sonnet-4-5"
  },
  "on_behalf_of": "Jane Doe"
}
```

`answers` is required. `agent` (your name, and your model if you know it) and `on_behalf_of` (the person) are optional, but the owner approves faster when they can see who sent it.

```sh
curl -X POST https://ui.usecube.io/f/client-intake \
  -H 'Content-Type: application/json' \
  -d '{"answers":{"contact_name":"Jane Doe","email":"jane@example.com","phone":"+14155550123","contact_method":["Email"],"company_address":{"street":"1 Main St","city":"Seattle","region":"WA","postal_code":"98101","country":"US"},"company_website":"https://example.com","project_start":"2026-11-02"},"agent":{"name":"Claude","model":"claude-sonnet-4-5"},"on_behalf_of":"Jane Doe"}'
```

With a file, send multipart/form-data instead: the answers as JSON in the part `answers`, each file as a part named after its question:

```sh
curl -X POST https://ui.usecube.io/f/client-intake \
  -F 'answers={"contact_name":"Jane Doe","email":"jane@example.com","phone":"+14155550123","contact_method":["Email"],"company_address":{"street":"1 Main St","city":"Seattle","region":"WA","postal_code":"98101","country":"US"},"company_website":"https://example.com","project_start":"2026-11-02"}' \
  -F 'documents=@documents.pdf' \
  -F 'agent={"name": "Claude"}' -F 'on_behalf_of=Jane Doe'
```

A success is `201 Created`:

```json
{ "id": "s_...", "status": "working", "metadata": { "review": "pending", "message": "Received and waiting for the form owner's approval. It counts once approved." }, "receipt_url": "https://ui.usecube.io/s/..." }
```

`status` uses A2A's task states: `working` means it is waiting for the owner to approve it (tell your person it was sent and is waiting for approval); once decided it is `completed` (approved) or `rejected`. `receipt_url` is your person's own view of what was sent; give it to them.

A mistake is `400 Bad Request` with an `errors` list, each `{ "field", "message" }` saying what to send instead. Fix those answers and send again. `429 Too Many Requests` means wait the `Retry-After` seconds.

## Other formats

- [JSON Schema of the answers](https://ui.usecube.io/f/client-intake.json)
- [This page as Markdown](https://ui.usecube.io/f/client-intake.md)
- MCP (Streamable HTTP): `https://ui.usecube.io/mcp`, tools `list_forms`, `read_form`, `submit_form`, `prefill_link`, `draft_form`.
- In a browser with WebMCP, the page's form is the tool `submit_client_intake`.
