Hanzo

Crm

Package crm is your sales pipeline: the companies, the people, the deals in play.

Package crm is your sales pipeline: the companies, the people, the deals in play.

Base URLhttps://api.hanzo.ai
Operations20
AuthAuthorization: Bearer $HANZO_API_KEY

crm

GET /v1/crm/applications/{id}

Returns one Startup Program application with its AI screen and stage history. An id belonging to another org reads as not found.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

PATCH /v1/crm/applications/{id}

Moves one Startup Program application through the pipeline. The move is recorded on the application's timeline, attributed to the calling staff user: it may advance exactly one stage, go back to any earlier stage, reject from any non-rejected stage, or reopen a rejected application to applied; anything else is refused. Rejecting requires a reason. A note with no stage change is still recorded.

ParameterInTypeRequiredDescription
idpathstringyesID is the application to move, from the path.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
idstringID is the application to move, from the path.
notestringNote is a free-text comment recorded on the timeline, with or without a stage change.
reasonstringReason records WHY, and is required to reject.
stagestringStage is the stage to move to: applied, screened, qualified, credits-offered, onboarded or rejected.

GET /v1/crm/applications

Returns the org's Startup Program applications, newest first. Each carries its AI screen and its stage history; a stage narrows the page to one pipeline stage.

ParameterInTypeRequiredDescription
stagequerystringStage returns only the applications at that pipeline stage when set: applied, screened, qualified, credits-offered,…
limitqueryintegerLimit caps the rows returned: 200 by default, 1000 at most.

POST /v1/crm/applications

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

GET /v1/crm/companies/{id}

Returns one of the caller org's companies. An id belonging to another org reads as not found.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

PUT /v1/crm/companies/{id}

Replaces one of the caller org's companies. Every writable field is taken from the request, so a field the request omits is CLEARED — send the whole record. A name is required.

ParameterInTypeRequiredDescription
idpathstringyesID names the company to update and comes from the path.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
arrintegerARR is annual recurring revenue in minor units (cents) of Currency.
citystringCity is the head-office city.
countrystringCountry is the head-office country.
currencystringCurrency is the ISO code ARR is denominated in; empty defaults to USD.
domainNamestringDomainName is the company's primary domain, e.g.
employeesintegerEmployees is the headcount.
idstringID names the company to update and comes from the path.
idealCustomerProfilebooleanICP marks the company as an ideal-customer-profile fit.
linkedinLinkstringLinkedin is the company's LinkedIn URL.
namestringName is the company name.
xLinkstringXLink is the company's X (Twitter) URL.

DELETE /v1/crm/companies/{id}

Removes one of the caller org's companies and answers 204. Any contact or opportunity in the org that referenced it keeps existing with the reference cleared, so nothing is left pointing at a company that is gone.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

GET /v1/crm/companies

Returns the caller org's companies, most recently updated first.

ParameterInTypeRequiredDescription
limitqueryintegerLimit caps the rows returned: 200 by default, 1000 at most.

POST /v1/crm/companies

Adds a company to the caller's org and answers 201 with the stored record. A name is required; an empty currency defaults to USD.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
arrintegerARR is annual recurring revenue in minor units (cents) of Currency.
citystringCity is the head-office city.
countrystringCountry is the head-office country.
currencystringCurrency is the ISO code ARR is denominated in; empty defaults to USD.
domainNamestringDomainName is the company's primary domain, e.g.
employeesintegerEmployees is the headcount.
idstringID names the company to update and comes from the path.
idealCustomerProfilebooleanICP marks the company as an ideal-customer-profile fit.
linkedinLinkstringLinkedin is the company's LinkedIn URL.
namestringName is the company name.
xLinkstringXLink is the company's X (Twitter) URL.

GET /v1/crm/contacts/{id}

Returns one of the caller org's contacts. An id belonging to another org reads as not found.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

PUT /v1/crm/contacts/{id}

Replaces one of the caller org's contacts. Every writable field is taken from the request, so a field the request omits is CLEARED — send the whole record. One of firstName, lastName or email is required.

ParameterInTypeRequiredDescription
idpathstringyesID names the contact to update and comes from the path.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
citystringCity is where the person is based.
companyIdstringCompanyID links the contact to one of the org's companies.
emailstringEmail is the person's email address.
firstNamestringFirstName is the person's given name.
idstringID names the contact to update and comes from the path.
jobTitlestringJobTitle is the person's role at their company.
lastNamestringLastName is the person's family name.
linkedinLinkstringLinkedin is the person's LinkedIn URL.
phonestringPhone is the person's phone number.
xLinkstringXLink is the person's X (Twitter) URL.

DELETE /v1/crm/contacts/{id}

Removes one of the caller org's contacts and answers 204. Any opportunity in the org that named it point of contact keeps existing with that reference cleared.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

GET /v1/crm/contacts

Returns the caller org's contacts, most recently updated first. A companyId narrows the page to the people at that company.

ParameterInTypeRequiredDescription
companyIdquerystringCompanyID returns only the contacts at that company when set.
limitqueryintegerLimit caps the rows returned: 200 by default, 1000 at most.

POST /v1/crm/contacts

Adds a person to the caller's org and answers 201 with the stored record. One of firstName, lastName or email is required, and a companyId must name a company in the same org.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
citystringCity is where the person is based.
companyIdstringCompanyID links the contact to one of the org's companies.
emailstringEmail is the person's email address.
firstNamestringFirstName is the person's given name.
idstringID names the contact to update and comes from the path.
jobTitlestringJobTitle is the person's role at their company.
lastNamestringLastName is the person's family name.
linkedinLinkstringLinkedin is the person's LinkedIn URL.
phonestringPhone is the person's phone number.
xLinkstringXLink is the person's X (Twitter) URL.

GET /v1/crm/opportunities/{id}

Returns one of the caller org's deals. An id belonging to another org reads as not found.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

PUT /v1/crm/opportunities/{id}

Replaces one of the caller org's deals. Every writable field is taken from the request, so a field the request omits is CLEARED — send the whole record. A name is required and the stage must be a pipeline stage.

ParameterInTypeRequiredDescription
idpathstringyesID names the opportunity to update and comes from the path.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
amountintegerAmount is the deal value in minor units (cents) of Currency.
closeDateintegerCloseDate is the expected close, as a unix second (0 = unset).
companyIdstringCompanyID links the deal to one of the org's companies.
currencystringCurrency is the ISO code Amount is denominated in; empty defaults to USD.
idstringID names the opportunity to update and comes from the path.
namestringName is the deal name.
pointOfContactIdstringPointOfContact links the deal to one of the org's contacts.
stagestringStage is the pipeline stage: NEW, SCREENING, MEETING, PROPOSAL or CUSTOMER (case-insensitive).

DELETE /v1/crm/opportunities/{id}

Removes one of the caller org's deals and answers 204.

ParameterInTypeRequiredDescription
idpathstringyesID is the record to act on, from the path.

GET /v1/crm/opportunities

Returns the caller org's deals, most recently updated first. A stage narrows the page to one pipeline stage.

ParameterInTypeRequiredDescription
stagequerystringStage returns only the opportunities at that pipeline stage when set (NEW, SCREENING, MEETING, PROPOSAL or CUSTOMER;…
limitqueryintegerLimit caps the rows returned: 200 by default, 1000 at most.

POST /v1/crm/opportunities

Adds a deal to the caller's org and answers 201 with the stored record. A name is required; the stage defaults to NEW; companyId and pointOfContactId must name records in the same org.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
amountintegerAmount is the deal value in minor units (cents) of Currency.
closeDateintegerCloseDate is the expected close, as a unix second (0 = unset).
companyIdstringCompanyID links the deal to one of the org's companies.
currencystringCurrency is the ISO code Amount is denominated in; empty defaults to USD.
idstringID names the opportunity to update and comes from the path.
namestringName is the deal name.
pointOfContactIdstringPointOfContact links the deal to one of the org's contacts.
stagestringStage is the pipeline stage: NEW, SCREENING, MEETING, PROPOSAL or CUSTOMER (case-insensitive).

GET /v1/crm/summary

Summary counts the caller org's CRM records: companies, contacts, opportunities.


All Hanzo APIs · Interactive reference

How is this guide?

On this page