Apply to the Startup Program from the public form
Files an application to the Startup Program and answers the id and pipeline stage it landed at. This is the ONE unauthenticated route in crm.
POST /v1/crm/applications
| Address | https://api.hanzo.ai/v1/crm/applications |
| Method | POST |
| Operation | post_crm_applications |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Files an application to the Startup Program and answers the id and pipeline stage it landed at.
This is the ONE unauthenticated route in crm. It takes no principal and never reads a caller org: the application is filed against the DEPLOYMENT's own program org — the brand, hanzo unless white-labelled — so there is no tenant to name and none to leak. Reading the application back is staff-only and lives elsewhere.
company, contactName and a parseable email are required; everything else is optional context. Re-submitting the same (email, company) REFRESHES the existing application instead of filing a second one, so an impatient applicant cannot duplicate their own lead — that is a 200 where a first submission is a 201. A filled hp honeypot field is answered exactly like a success and stored nowhere, so a bot cannot tell a drop from an accept.
Filing is not screening: the application lands at stage applied with its AI screen still pending, and the screen runs afterwards on its own clock. A company and contact are also projected into the program org's ordinary CRM lists, best-effort — that projection failing does not fail the application. Bodies over 64 KiB are refused, and submissions are rate-limited.
Request
The document declares no body for POST /v1/crm/applications. The handler is typed in cloud but its shape is not yet emitted, so the fields are not listed here — ask the MCP door's describe for post_crm_applications, which answers from the running route.
Response
The document declares no response body for this operation. It answers 200 on success and the platform error shape on failure — see Errors.
Examples
hanzo crm applications createimport { Configuration, CrmApi } from 'hanzoai';
const api = new CrmApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postCrmApplications();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import CrmApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = CrmApi(client).post_crm_applications()cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.CrmAPI.PostCrmApplications(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, crm_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = crm_api::post_crm_applications(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.CrmApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new CrmApi(client).postCrmApplications();curl -X POST https://api.hanzo.ai/v1/crm/applications \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches crm through the crm tool, which names its 20 operations with its own verbs — this one among them, under a name only the door declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "list_crm_applications"
}
}
}'How is this guide?