Create safes

Records a SAFE — a simple agreement for future equity.

POST /v1/captable/safes

Addresshttps://api.hanzo.ai/v1/captable/safes
MethodPOST
Operationpost_captable_safes
AuthAuthorization: Bearer $HANZO_API_KEY

Records a SAFE — a simple agreement for future equity.

Request

10 fields, body application/json (required).

FieldInTypeRequiredDescription
additionalTermsbodyany—AdditionalTerms is free text for anything the fields above do not carry.
boardApprovalDatebodyany—BoardApprovalDate is when the board approved it, YYYY-MM-DD.
capitalbodyany—Capital is the money invested, in the company's currency.
discountRatebodyany—DiscountRate is the discount to the next round's price, as a percentage.
issueDatebodyany—IssueDate is when the SAFE was signed, YYYY-MM-DD.
publicIdbodyany—PublicID is the SAFE's identifier.
stakeholderIdbodyany—StakeholderID is the investor.
statusbodyany—Status is DRAFT, ACTIVE, PENDING, EXPIRED or CANCELLED.
typebodyany—Type is PRE_MONEY or POST_MONEY — which side of the new money the cap is measured on.
valuationCapbodyany—ValuationCap is the valuation the SAFE converts at, at most.

Response

StatusBodyMeaning
201captable.captableCreatedcreated
defaultproblem-detailsrefused

201 body — 3 fields.

FieldInTypeAlwaysDescription
idbodystring—ID is the created row's id.
messagebodystring—Message is the human sentence the cap table wrote, e.g. "Share issued".
successbodyboolean—Success is true when the row was written.

Failure carries the platform error shape — see Errors.

Examples

hanzo captable safes create
import { Configuration, CaptableApi } from 'hanzoai';

const api = new CaptableApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postCaptableSafes({ additionalTerms: "<additionalTerms>", boardApprovalDate: "<boardApprovalDate>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import CaptableApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = CaptableApi(client).post_captable_safes(additional_terms="<additionalTerms>", board_approval_date="<boardApprovalDate>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.CaptableAPI.PostCaptableSafes(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, captable_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = captable_api::post_captable_safes(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.CaptableApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new CaptableApi(client).postCaptableSafes();
curl -X POST https://api.hanzo.ai/v1/captable/safes \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "additionalTerms": "<additionalTerms>",
       "boardApprovalDate": "<boardApprovalDate>"
     }'

MCP reaches captable through the captable tool, which names its 30 operations with its own verbs — this one among them, under a name only MCP 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_captable_classes"
         }
       }
     }'

Captable API · All Hanzo APIs · Interactive reference

Was this page useful?