Captable
Package captable is your cap table: stakeholders, share classes, grants, SAFEs, rounds, and who owns what.
Package captable is your cap table: stakeholders, share classes, grants, SAFEs, rounds, and who owns what.
| Base URL | https://api.hanzo.ai |
| Operations | 31 |
| Auth | Authorization: Bearer $HANZO_API_KEY |
captable
GetCompany returns the caller org's cap-table company record.
GET /v1/captable/company
GetCompany returns the caller org's cap-table company record. The row is seeded when the tenant's store first opens, so it always exists; its name and incorporation details are set with PUT /v1/captable/company.
UpdateCompany sets the caller org's company name and incorporation details.
PUT /v1/captable/company
UpdateCompany sets the caller org's company name and incorporation details. The name is required; the three incorporation fields are optional and each is stored as empty when omitted, so a call that sends only a name CLEARS them. The company row itself is seeded when the tenant's store first opens, so this never creates one.
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
incorporationCountry | — | IncorporationCountry is the ISO country the entity is incorporated in. Optional; omitted, null or empty clears it. | |
incorporationState | — | IncorporationState is the state or province of incorporation. Optional; omitted, null or empty clears it. | |
incorporationType | — | IncorporationType is the entity kind, e.g. LLC or C_CORP. Optional; omitted, null or empty clears it. | |
name | — | Name is the company's legal name. Required, and it must be a non-empty string — anything else is refused with the cap ta |
DeleteConvertible removes one of the caller org's convertible notes, taking its principal out of the cap table's unconverted-instrument totals.
DELETE /v1/captable/convertibles/{id}
DeleteConvertible removes one of the caller org's convertible notes, taking its principal out of the cap table's unconverted-instrument totals. An id this org does not hold is not found.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the convertible note to delete. |
ListConvertibles returns the caller org's convertible notes, newest first.
GET /v1/captable/convertibles
ListConvertibles returns the caller org's convertible notes, newest first. A note's principal sits OUTSIDE issued equity until it converts, so it is not part of the share counts.
post_v1_captable_convertibles
POST /v1/captable/convertibles
ListEquityPlans returns the caller org's equity plans, newest first.
GET /v1/captable/equity-plans
ListEquityPlans returns the caller org's equity plans, newest first. An equity plan is an option pool: a reserve of shares, drawn from one share class, that option grants are written against.
post_v1_captable_equity-plans
POST /v1/captable/equity-plans
ListInvestments returns the caller org's investments, newest first.
GET /v1/captable/investments
ListInvestments returns the caller org's investments, newest first. It spans every round, so it is the flat ledger of cheques written into the company, each naming its investor and the round it went into.
DeleteOption removes one of the caller org's option grants, taking its shares out of the cap table's granted-options and fully-diluted counts.
DELETE /v1/captable/options/{id}
DeleteOption removes one of the caller org's option grants, taking its shares out of the cap table's granted-options and fully-diluted counts. An id this org does not hold is not found.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the option grant to delete. |
ListOptions returns the caller org's option grants, newest first.
GET /v1/captable/options
ListOptions returns the caller org's option grants, newest first. Each row is joined to its grantee and its equity plan. Grants that are EXERCISED, EXPIRED or CANCELLED are listed here but do not dilute the cap table.
post_v1_captable_options
POST /v1/captable/options
CloseRound closes one of the caller org's fundraising rounds, recording the close date and moving its status to CLOSED.
POST /v1/captable/rounds/{id}/close
CloseRound closes one of the caller org's fundraising rounds, recording the close date and moving its status to CLOSED. Only an OPEN round can be closed: a round that is already closed — like an id this org does not hold — is not found. Closing a round does not change what was invested in it.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the round to close. It is the path segment: the URL is the addressing authority, and the org it is resolved in com |
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
closeDate | — | CloseDate is the date to record the round as closed on. Optional: omitted, null or empty records TODAY. | |
id | string | — | ID is the round to close. It is the path segment: the URL is the addressing authority, and the org it is resolved in com |
post_v1_captable_rounds_by_id_investments
POST /v1/captable/rounds/{id}/investments
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
GetRound returns one of the caller org's fundraising rounds together with every investment written into it, oldest first.
GET /v1/captable/rounds/{id}
GetRound returns one of the caller org's fundraising rounds together with every investment written into it, oldest first. A round id that does not exist in the caller's org is not found — including one that exists in another tenant, since the org comes from the caller's principal and is part of the lookup.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the round to read. It is the path segment: the URL is the addressing authority, and the org it is resolved in come |
ListRounds returns the caller org's fundraising rounds, newest first.
GET /v1/captable/rounds
ListRounds returns the caller org's fundraising rounds, newest first. A round groups a fundraising event; a PRICED round also carries the share class and price per share it issues at.
post_v1_captable_rounds
POST /v1/captable/rounds
DeleteSafe removes one of the caller org's SAFEs, taking its capital out of the cap table's unconverted-instrument totals.
DELETE /v1/captable/safes/{id}
DeleteSafe removes one of the caller org's SAFEs, taking its capital out of the cap table's unconverted-instrument totals. An id this org does not hold is not found.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the SAFE to delete. |
ListSafes returns the caller org's SAFEs, newest first.
GET /v1/captable/safes
ListSafes returns the caller org's SAFEs, newest first. A SAFE is a simple agreement for future equity: its capital sits OUTSIDE issued equity until it converts, so it is not part of the share counts.
post_v1_captable_safes
POST /v1/captable/safes
patch_v1_captable_share-classes_by_id
PATCH /v1/captable/share-classes/{id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
ListShareClasses returns the caller org's share classes, in creation order.
GET /v1/captable/share-classes
ListShareClasses returns the caller org's share classes, in creation order. A share class is what a certificate is issued in, and every class the company has authorized appears. The response is a bare JSON array, not an envelope.
post_v1_captable_share-classes
POST /v1/captable/share-classes
DeleteShare removes one of the caller org's share certificates, taking its shares out of the cap table's outstanding and fully-diluted counts.
DELETE /v1/captable/shares/{id}
DeleteShare removes one of the caller org's share certificates, taking its shares out of the cap table's outstanding and fully-diluted counts. An id this org does not hold is not found.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the share certificate to delete. |
post_v1_captable_shares_transfer
POST /v1/captable/shares/transfer
ListShares returns the caller org's share certificates, newest first.
GET /v1/captable/shares
ListShares returns the caller org's share certificates, newest first. Each row is joined to its holder and its share class, so a certificate names who holds it and what class it is in without a second call.
post_v1_captable_shares
POST /v1/captable/shares
UpdateStakeholder changes one of the caller org's stakeholders.
PATCH /v1/captable/stakeholders/{id}
UpdateStakeholder changes one of the caller org's stakeholders. It is a PARTIAL update: only the fields the request names are written, and a field sent as null clears that column. A request that names no updatable field is refused, and an id this org does not hold is not found.
The values are stored as sent. Unlike adding a stakeholder, this route does not check the email's shape or the type and relationship vocabularies, so it can record a value that adding one would have rejected.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the stakeholder to update. It is the path segment: the URL is the addressing authority, and the org it is resolved |
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
city | — | City is the stakeholder's city. | |
currentRelationship | — | CurrentRelationship is how the stakeholder relates to the company, e.g. FOUNDER, INVESTOR or EMPLOYEE. | |
email | — | Email is the stakeholder's email. This route stores it as sent — unlike adding a stakeholder, it is not checked for shap | |
id | string | — | ID is the stakeholder to update. It is the path segment: the URL is the addressing authority, and the org it is resolved |
institutionName | — | InstitutionName names the institution, when the stakeholder is one. | |
name | — | Name is the stakeholder's full name. | |
stakeholderType | — | StakeholderType is INDIVIDUAL or INSTITUTION. | |
state | — | State is the stakeholder's state or province. | |
streetAddress | — | StreetAddress is the stakeholder's street address. | |
taxId | — | TaxID is the stakeholder's tax identifier. | |
zipcode | — | Zipcode is the stakeholder's postal code. |
DeleteStakeholder removes one of the caller org's stakeholders.
DELETE /v1/captable/stakeholders/{id}
DeleteStakeholder removes one of the caller org's stakeholders. It REFUSES to orphan issued equity: a holder that still holds share certificates or option grants cannot be deleted, and answers 400 saying so — release or transfer the holdings first. An id this org does not hold is not found.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | ID is the stakeholder to delete. |
ListStakeholders returns the caller org's stakeholders, newest first.
GET /v1/captable/stakeholders
ListStakeholders returns the caller org's stakeholders, newest first. The response is a bare JSON array, not an envelope. Each row carries the holder's contact and address fields alongside the company's name.
post_v1_captable_stakeholders
POST /v1/captable/stakeholders
GetSummary computes the caller org's cap table.
GET /v1/captable/summary
GetSummary computes the caller org's cap table. It answers who owns what on a fully-diluted basis: outstanding shares, granted options, per-stakeholder ownership percentages, each share class's authorized versus issued position, and the capital sitting on SAFEs and convertible notes that have not yet converted. Only non-terminal option grants dilute — EXERCISED, EXPIRED and CANCELLED grants are excluded, so equity issued through an exercised option is never counted twice.
How is this guide?