Create vendors

Creates or updates one vendor in the org's vendor book, keyed by its canonical name — writing a canonical name that already exists REPLACES that row's aliases and default category.

POST /v1/books/vendors

Addresshttps://api.hanzo.ai/v1/books/vendors
MethodPOST
Operationpost_books_vendors
AuthAuthorization: Bearer $HANZO_API_KEY

Creates or updates one vendor in the org's vendor book, keyed by its canonical name — writing a canonical name that already exists REPLACES that row's aliases and default category. A category given as a slug ("software") is normalized to its real COA expense account, and anything unrecognized becomes 5900 Uncategorized rather than a guessed real account. It answers the row exactly as stored, so the caller sees the normalization. Recording a vendor is what makes future bills from it self-classify instead of asking again.

Request

3 fields, body application/json (required).

FieldInTypeRequiredDescription
aliasesbodystring[]—Aliases are the other spellings a receipt may print the vendor under; a scan matching any of them resolves to this vendor.
canonicalbodystring—Canonical is the vendor's one true name, and the key an upsert writes by.
defaultCategorybodystring—DefaultCategory is the COA expense account new bills from this vendor book to.

Response

StatusBodyMeaning
200books.VendorRowok
defaultproblem-detailsrefused

200 body — 3 fields.

FieldInTypeAlwaysDescription
aliasesbodystring[]—Aliases are the other spellings a receipt may print the vendor under; a scan matching any of them resolves to this vendor.
canonicalbodystring—Canonical is the vendor's one true name, and the key an upsert writes by.
defaultCategorybodystring—DefaultCategory is the COA expense account new bills from this vendor book to.

Failure carries the platform error shape — see Errors.

Examples

hanzo books vendors create
import { Configuration, BooksApi } from 'hanzoai';

const api = new BooksApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postBooksVendors({ aliases: ["<aliases>"], canonical: "<canonical>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import BooksApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = BooksApi(client).post_books_vendors(aliases=["<aliases>"], canonical="<canonical>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

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

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

let result = books_api::post_books_vendors(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.BooksApi;

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

var result = new BooksApi(client).postBooksVendors();
curl -X POST https://api.hanzo.ai/v1/books/vendors \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "aliases": [
         "<aliases>"
       ],
       "canonical": "<canonical>"
     }'

MCP reaches books through the books tool, which names its 20 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_book_accounts"
         }
       }
     }'

Books API · All Hanzo APIs · Interactive reference

Was this page useful?