API リファレンス

KakeiboClient

メインのクライアントクラス。コンテキストマネージャ(with 文)に対応。

コンストラクタ

KakeiboClient(
    base_url: str,
    api_key: str,
    *,
    timeout: float = 30.0,
    http_client: httpx.Client | None = None,
)
引数 説明
base_url str サーバーの URL(例: "https://example.com"
api_key str API キー(ik_ プレフィックス付き)
timeout float HTTP タイムアウト秒数(デフォルト: 30.0)
http_client httpx.Client \| None カスタム httpx クライアント(テスト用)

メソッド

create_journal

仕訳を起票する。必要なスコープ: journals:create

create_journal(
    *,
    date: date | datetime | str,
    description: str,
    lines: list[JournalLine],
    source: str = "api",
    draft_id: int | None = None,
) -> JournalCreateResponse
引数 説明
date date \| datetime \| str 日付。date, datetime, または "YYYY-MM-DD" 文字列
description str 摘要(必須、空文字不可)
lines list[JournalLine] 仕訳明細行のリスト(1行以上必須)
source str ソース種別(デフォルト: "api"
draft_id int \| None 確定する下書き ID(省略可)。指定すると下書きの status が done になる

戻り値: JournalCreateResponse

get_journal

仕訳を1件取得する。必要なスコープ: journals:read

get_journal(journal_id: int) -> JournalDetail
引数 説明
journal_id int 仕訳 ID

戻り値: JournalDetail

list_journals

仕訳一覧を取得する。必要なスコープ: journals:read

list_journals(
    *,
    date_from: date | datetime | str | None = None,
    date_to: date | datetime | str | None = None,
    page: int = 1,
    per_page: int = 20,
) -> JournalListResponse
引数 説明
date_from date \| datetime \| str \| None 日付の下限(省略可)
date_to date \| datetime \| str \| None 日付の上限(省略可)
page int ページ番号(デフォルト: 1)
per_page int 1ページあたりの件数(デフォルト: 20, 上限: 100)

戻り値: JournalListResponse

delete_journal

仕訳を削除する。必要なスコープ: journals:delete

delete_journal(journal_id: int) -> None
引数 説明
journal_id int 仕訳 ID

例外: 確定済み期間や提出ロック中の仕訳は削除不可(KakeiboAPIError 400)

analyze

画像を AI 解析して下書きを作成する。必要なスコープ: ai:analyze

analyze(
    image: str | Path | bytes,
    *,
    comment: str = "",
    notify: bool = False,
    mime_type: str | None = None,
) -> AnalyzeResponse
引数 説明
image str \| Path \| bytes 画像ファイルパスまたはバイト列
comment str メモ(省略可、最大500文字)
notify bool True で Webhook 通知を送信
mime_type str \| None バイト列渡し時の MIME タイプ(デフォルト: image/jpeg

戻り値: AnalyzeResponse

list_drafts

下書き一覧を取得する。必要なスコープ: ai:analyze

list_drafts(
    *,
    status: str = "analyzed",
    page: int = 1,
    per_page: int = 50,
) -> DraftListResponse
引数 説明
status str フィルタ: "analyzed" / "done" / "all"(デフォルト: "analyzed"
page int ページ番号(デフォルト: 1)
per_page int 1ページあたりの件数(デフォルト: 50, 上限: 100)

戻り値: DraftListResponse

get_draft

下書き詳細を取得する(候補データ含む)。必要なスコープ: ai:analyze

get_draft(draft_id: int) -> DraftDetail
引数 説明
draft_id int 下書き ID

戻り値: DraftDetail

delete_draft

下書きを削除する。必要なスコープ: ai:analyze

delete_draft(draft_id: int) -> None
引数 説明
draft_id int 下書き ID

close

内部の HTTP クライアントを閉じる。コンテキストマネージャ使用時は自動的に呼ばれる。

close() -> None

データモデル

JournalLine

仕訳の1明細行を表すデータクラス。

@dataclass
class JournalLine:
    account_id: int
    debit: int = 0
    credit: int = 0
    description: str = ""
フィールド 説明
account_id int 勘定科目 ID(必須)
debit int 借方金額(デフォルト: 0)
credit int 貸方金額(デフォルト: 0)
description str 行レベルの摘要(省略可)

注意: 仕訳全体で借方合計と貸方合計が一致する必要があります(複式簿記)。

JournalCreateResponse

仕訳起票の成功レスポンス。

@dataclass
class JournalCreateResponse:
    id: int
    entry_number: int

JournalDetail

仕訳の詳細情報。get_journal / list_journals の戻り値で使用。

@dataclass
class JournalDetail:
    id: int
    date: str
    entry_number: int
    description: str
    source: str
    lines: list[JournalLine]

JournalListResponse

仕訳一覧のレスポンス。

@dataclass
class JournalListResponse:
    journals: list[JournalDetail]
    total: int
    page: int
    per_page: int

AnalyzeResponse

AI 解析レスポンス。

@dataclass
class AnalyzeResponse:
    draft_id: int
    suggestions: list[dict]
フィールド 説明
draft_id int 作成された下書きの ID
suggestions list[dict] 仕訳候補のリスト(各候補に title, date, entry_description, lines 等を含む)

DraftSummary

下書きのサマリー情報。

@dataclass
class DraftSummary:
    title: str = ""
    date: str = ""
    description: str = ""
    amount: int = 0
    suggestion_count: int = 0

DraftListItem

下書き一覧の1件。list_drafts の戻り値で使用。

@dataclass
class DraftListItem:
    id: int
    status: str
    comment: str
    created_at: str
    summary: DraftSummary | None = None

DraftListResponse

下書き一覧のレスポンス。

@dataclass
class DraftListResponse:
    drafts: list[DraftListItem]
    total: int
    page: int
    per_page: int

DraftDetail

下書きの詳細。get_draft の戻り値で使用。候補データを含む。

@dataclass
class DraftDetail:
    id: int
    status: str
    comment: str
    created_at: str
    summary: DraftSummary | None = None
    suggestions: list[dict] = field(default_factory=list)

例外クラス

KakeiboAPIError

API がエラーレスポンスを返した場合の基底例外。

class KakeiboAPIError(Exception):
    status_code: int   # HTTP ステータスコード
    message: str       # サーバーからのエラーメッセージ

AuthenticationError

KakeiboAPIError のサブクラス。401 レスポンス時に送出。

class AuthenticationError(KakeiboAPIError):
    # status_code は常に 401

主なエラーメッセージ(サーバーから返される):

ステータス メッセージ 原因
401 Authorization ヘッダーが必要です。 Bearer トークン未指定
401 無効な API キーです。 キーが無効または無効化済み
403 この API キーには ai:analyze 権限がありません。 スコープ不足
400 date は必須です。 日付が未指定
400 description は必須です。 摘要が未指定
400 lines は必須です(配列)。 明細行が未指定
400 AI API設定が未登録です。 サーバーでAI設定未完了
400 下書き(id=N)が見つからないか、既に確定済みです。 無効な draft_id
404 仕訳が見つかりません。 指定 ID の仕訳が存在しない
404 下書きが見つかりません。 指定 ID の下書きが存在しない