{"openapi":"3.0.3","info":{"title":"BennyBooks API","version":"1.0.0","description":"REST API for MCP agents and external integrations. Authenticate with a BennyBooks MCP token (`bb_live_…`) created in Settings → MCP access. Prefer the curated MCP tool set (see x-mcp / skill.md): ~12 tools, lean list limits, approval-gated writes.\n## Agent / MCP instructions\nBennyBooks agent API (via MCP bridge or REST).\n\nRules:\n1. Prefer categoryCode (e.g. 5100) over free-text category names.\n2. Use limit≤50 on list tools unless you need more.\n3. Writes create pending proposals — never treat a proposal as a posted ledger entry.\n4. Prefer get_transaction over list_notes; it returns notes and receipts together.\n5. Prefer attach_note (proposal) over create_note (direct write).\n6. Do not pass org_id — the token is already org-scoped.\n7. Start workflows from /skill.md patterns: categorize, investigate, month-end.\n8. Explainability is first-class: every write is audit-logged. Humans review proposals in Ledger → Approvals and the durable trail in Log (/log). Write clear reason, confidence, and evidence — that text is what humans see. There is no agent API to read /log in v1.\n\nCurated tools only: enable the exposeByDefault set in OpenAPI x-mcp / AnythingMCP config. Skip create_note, list_notes, get_ontology_context, and get_proposal unless you have a specific need.\nBridge note: enable only operations with `x-mcp.exposeByDefault: true` (see config/anythingmcp-bennybooks.yaml). Cloud AnythingMCP cannot fetch `localhost` — tunnel or self-host.","contact":{"name":"BennyBooks","url":"https://github.com/bennybooks"},"x-mcp":{"curatedToolCount":12,"recommendedListLimit":50,"skillUrl":"https://bennybooks.com/skill.md","designDoc":"https://bennybooks.com/developers/guides/mcp-design.md","auditLogDoc":"https://bennybooks.com/developers/guides/audit-log.md","anythingMcpConfig":"https://bennybooks.com/developers/guides/anythingmcp.md"}},"servers":[{"url":"https://bennybooks.com","description":"BennyBooks API"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Transactions","description":"Ledger transactions"},{"name":"Dashboard","description":"Aggregates and stats"},{"name":"Receipts","description":"Receipt search"},{"name":"Categories","description":"Chart of accounts"},{"name":"Connectors","description":"Data source sync status"},{"name":"Proposals","description":"Agent write proposals (approval-gated)"},{"name":"Notes","description":"Transaction notes"},{"name":"Ontology","description":"Semantic model (public, no auth)"}],"paths":{"/api/v1/ontology.jsonld":{"get":{"operationId":"get_ontology","summary":"Get ontology (JSON-LD)","description":"Load the public BennyBooks ontology (JSON-LD): chart codes, synonyms, and seed counterparties. Use when starting categorization or when list_categories is unavailable. Do NOT use for live org ledger data.\n\nExamples:\n- Before proposing categories, call get_ontology or list_categories once per session.","tags":["Ontology"],"security":[],"responses":{"200":{"description":"JSON-LD ontology document","content":{"application/ld+json":{"schema":{"type":"object"}}}}},"x-mcp":{"exposeByDefault":true,"scope":"public","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/ontology/context.jsonld":{"get":{"operationId":"get_ontology_context","summary":"Get JSON-LD context","description":"Public JSON-LD @context only. Prefer get_ontology for agents. Expose only if expanding JSON-LD clients need it.","tags":["Ontology"],"security":[],"responses":{"200":{"description":"JSON-LD context document","content":{"application/ld+json":{"schema":{"type":"object"}}}}},"x-mcp":{"exposeByDefault":false,"scope":"public","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/transactions":{"get":{"operationId":"list_transactions","summary":"List transactions","description":"List ledger rows for the token's organization. Filter by status (e.g. uncategorized, receipt_missing), source, dates, category, or description substring. Default limit is 50 — keep batches small. Do NOT use for a single known id (use get_transaction). Do NOT request limit>100 unless exporting.\n\nExamples:\n- list_transactions status=uncategorized limit=50\n- list_transactions dateFrom=2026-08-01 dateTo=2026-08-31","tags":["Transactions"],"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["uncategorized","matched","receipt_missing","agent_suggested","reconciled"]}},{"name":"source","in":"query","schema":{"type":"string","enum":["nordea","stripe","manual_csv"]}},{"name":"date","in":"query","description":"Exact date (YYYY-MM-DD)","schema":{"type":"string","format":"date"}},{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"category","in":"query","description":"Category name, or `__uncategorized__` for uncategorized","schema":{"type":"string"}},{"name":"description","in":"query","description":"Substring match on description","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size. Agents should use ≤50 unless exporting. Max 500.","schema":{"type":"integer","minimum":1,"maximum":500,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Transaction list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}},"meta":{"type":"object","properties":{"totalCount":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/transactions/{id}":{"get":{"operationId":"get_transaction","summary":"Get transaction","description":"Fetch one transaction plus linked notes and receipts. Use when investigating before categorize/link/note. Prefer this over list_notes. Do NOT use to scan the whole ledger.","tags":["Transactions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Transaction detail","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionDetail"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/dashboard/summary":{"get":{"operationId":"get_dashboard_summary","summary":"Get dashboard summary","description":"Org financial snapshot and workload: revenue, expenses, cashPosition, uncategorized, missingReceipts, agentSuggested (pending proposals count), notifications. Start month-end here. Do NOT use to list individual transactions (use list_transactions with status filters).","tags":["Dashboard"],"responses":{"200":{"description":"Dashboard aggregates","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DashboardSummary"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/receipts/search":{"get":{"operationId":"search_receipts","summary":"Search receipts","description":"Search receipt file names and OCR text by query string q. Use to find a receipt before propose_receipt_link. Do NOT use for bank lines (use list_transactions).\n\nExamples:\n- search_receipts q=\"AWS\"\n- search_receipts q=\"invoice 1042\"","tags":["Receipts"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching receipts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Receipt"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/categories":{"get":{"operationId":"list_categories","summary":"List categories","description":"Return this org's chart of accounts with stable codes, synonyms, and inUse flags. Call before propose_categorization. Prefer categoryCode from this list. Do NOT invent category codes.\n\nExamples:\n- list_categories → find code 5300 for AWS → propose_categorization with categoryCode 5300","tags":["Categories"],"responses":{"200":{"description":"Category list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/connectors":{"get":{"operationId":"list_connectors","summary":"List connectors","description":"Show bank/payment connectors with provider, lastSyncAt, and syncStatus (ok|error|stale). Use to explain where numbers came from or before month-end reconcile. Do NOT use to invent transactions.","tags":["Connectors"],"responses":{"200":{"description":"Connector list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Connector"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/proposals":{"get":{"operationId":"list_pending_proposals","summary":"List pending proposals","description":"List agent proposals awaiting human approval. Use after writes or during month-end to see what is still pending. Do NOT treat listed items as posted ledger changes.","tags":["Proposals"],"responses":{"200":{"description":"Pending proposals","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Proposal"}},"meta":{"type":"object","properties":{"count":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"x-mcp":{"exposeByDefault":true,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/proposals/{id}":{"get":{"operationId":"get_proposal","summary":"Get proposal","description":"Fetch one proposal by id. Prefer list_pending_proposals for queues. Use when you already have a proposal id.","tags":["Proposals"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Proposal detail","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Proposal"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":false,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}},"/api/v1/proposals/categorization":{"post":{"operationId":"propose_categorization","summary":"Propose categorization","description":"Propose a category for an existing transaction. Prefer categoryCode. Include confidence (0–1), reason, and optional evidence[] — humans see these in Ledger → Approvals and the durable Log (/log). Creates a pending proposal only — do NOT claim the category is applied. Do NOT invent codes not in list_categories/ontology.\n\nExamples:\n- {\"transactionId\":\"…\",\"categoryCode\":\"5300\",\"confidence\":0.91,\"reason\":\"Matches counterparty AWS\",\"evidence\":[{\"type\":\"counterparty_match\",\"value\":\"aws\"}]}","tags":["Proposals"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategorizationProposal"}}}},"responses":{"201":{"description":"Proposal created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Proposal"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":true,"scope":"propose-write","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}}},"/api/v1/proposals/journal-entry":{"post":{"operationId":"propose_journal_entry","summary":"Propose journal entry","description":"Propose a new manual ledger row (date, amount, currency, description, optional categoryCode). Amount: negative=outflow, positive=inflow. Pending until approved — never auto-post. The proposal is audit-logged in Log (/log). Do NOT use to edit existing transactions.","tags":["Proposals"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryProposal"}}}},"responses":{"201":{"description":"Proposal created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Proposal"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"x-mcp":{"exposeByDefault":true,"scope":"propose-write","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}}},"/api/v1/proposals/receipt-link":{"post":{"operationId":"propose_receipt_link","summary":"Propose receipt link","description":"Propose linking an existing receiptId to a transactionId. Prefer after search_receipts. Pending until approved; appears in Log (/log). Do NOT upload files via this tool (receipt upload is session-only).","tags":["Proposals"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiptLinkProposal"}}}},"responses":{"201":{"description":"Proposal created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Proposal"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":true,"scope":"propose-write","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}}},"/api/v1/notes":{"get":{"operationId":"list_notes","summary":"List notes","description":"Notes for a transactionId. Prefer get_transaction which already includes notes. Redundant for most agent workflows.","tags":["Notes"],"parameters":[{"name":"transactionId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Note list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":false,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}},"post":{"operationId":"attach_note","summary":"Attach note (proposal)","description":"Propose attaching a free-text note to a transaction (approval-gated; audit-logged in Log). Prefer this over create_note. Do NOT store secrets in notes.","tags":["Notes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRequest"}}}},"responses":{"201":{"description":"Proposal created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Proposal"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"x-mcp":{"exposeByDefault":true,"scope":"propose-write","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}},"put":{"operationId":"create_note","summary":"Create note (direct)","description":"Directly create a note without approval. Trusted automation only. Prefer attach_note for v1 agents. Do NOT enable in AnythingMCP for untrusted agents.\n\nDeprecated for MCP agents: prefer attach_note.","tags":["Notes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRequest"}}}},"responses":{"201":{"description":"Note created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Note"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"x-mcp":{"exposeByDefault":false,"scope":"propose-write","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},"deprecated":true}},"/api/v1/receipts/{id}":{"get":{"operationId":"get_receipt","summary":"Get receipt","description":"Receipt metadata by id (not file bytes). Prefer search_receipts then propose_receipt_link. Use when you already have a receipt id.","tags":["Receipts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Receipt detail","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Receipt"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"x-mcp":{"exposeByDefault":false,"scope":"read","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"BennyBooks MCP token (`bb_live_…`) from Settings → MCP access"}},"schemas":{"Transaction":{"type":"object","required":["id","date","amount","currency","description","status","source"],"properties":{"id":{"type":"string","format":"uuid"},"date":{"type":"string","format":"date"},"amount":{"type":"number","description":"Negative = outflow, positive = inflow"},"currency":{"type":"string","example":"EUR"},"description":{"type":"string"},"category":{"type":"string","nullable":true},"status":{"type":"string","enum":["uncategorized","matched","receipt_missing","agent_suggested","reconciled"]},"source":{"type":"string","enum":["nordea","stripe","manual_csv"]},"externalId":{"type":"string","nullable":true},"suggestedBy":{"type":"string","nullable":true,"description":"Actor that suggested the category, e.g. mcp:<tokenId>"},"confidence":{"type":"number","nullable":true,"minimum":0,"maximum":1,"description":"Agent confidence 0.0–1.0 when category was suggested"},"reason":{"type":"string","nullable":true,"description":"Human-readable explanation for the suggestion"}}},"TransactionDetail":{"type":"object","properties":{"transaction":{"$ref":"#/components/schemas/Transaction"},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}},"receipts":{"type":"array","items":{"$ref":"#/components/schemas/Receipt"}}}},"Note":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"transactionId":{"type":"string","format":"uuid"},"content":{"type":"string"},"authorUserId":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"Receipt":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"transactionId":{"type":"string","format":"uuid","nullable":true},"fileName":{"type":"string"},"mimeType":{"type":"string"},"sizeBytes":{"type":"integer"},"ocrText":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"Category":{"type":"object","properties":{"code":{"type":"string","description":"Stable chart-of-accounts code (e.g. 5100). Empty for ad-hoc categories."},"name":{"type":"string","description":"Canonical display name. Prefer proposing by code; this name is stored on transactions today."},"type":{"type":"string","enum":["revenue","expense","asset","liability","equity"]},"inUse":{"type":"boolean"},"parentCode":{"type":"string","nullable":true,"description":"Parent category code when hierarchical"},"synonyms":{"type":"array","items":{"type":"string"},"description":"Alternate labels (bank memos, informal names)"}}},"Connector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"provider":{"type":"string"},"status":{"type":"string"},"lastSyncAt":{"type":"string","format":"date-time","nullable":true},"syncStatus":{"type":"string","enum":["ok","error","stale"],"nullable":true}}},"Proposal":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["categorization","journal_entry","note","receipt_link"]},"status":{"type":"string","enum":["pending","approved","rejected"]},"payload":{"type":"object"},"proposedBy":{"type":"string"},"confidence":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"DashboardSummary":{"type":"object","properties":{"currency":{"type":"string"},"revenue":{"type":"number"},"expenses":{"type":"number"},"cashPosition":{"type":"number"},"pendingReview":{"type":"integer"},"missingReceipts":{"type":"integer"},"uncategorized":{"type":"integer"},"agentSuggested":{"type":"integer"},"recentTransactions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"amount":{"type":"number"},"description":{"type":"string"},"status":{"type":"string"}}}},"monthlyTrend":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string"},"revenue":{"type":"number"},"expenses":{"type":"number"}}}}}},"CategorizationProposal":{"type":"object","additionalProperties":false,"required":["transactionId"],"description":"Provide categoryCode (preferred) and/or category (canonical name). At least one is required.","properties":{"transactionId":{"type":"string","format":"uuid"},"categoryCode":{"type":"string","description":"Stable chart code, e.g. 5300 for Cloud infrastructure. Preferred over category name."},"category":{"type":"string","description":"Canonical category name from GET /categories (or a known synonym). Resolved to the chart name when possible."},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string"},"evidence":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/EvidenceItem"},"description":"Structured justification for the suggestion (optional)."}}},"EvidenceItem":{"type":"object","additionalProperties":false,"required":["type","value"],"properties":{"type":{"type":"string","enum":["counterparty_match","rule","historical","keyword","receipt"]},"value":{"type":"string"},"detail":{"type":"string"}}},"ReceiptLinkProposal":{"type":"object","additionalProperties":false,"required":["transactionId","receiptId"],"properties":{"transactionId":{"type":"string","format":"uuid"},"receiptId":{"type":"string","format":"uuid"},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string"}}},"JournalEntryProposal":{"type":"object","additionalProperties":false,"required":["date","description","amount"],"properties":{"date":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"type":"string","minLength":1},"amount":{"type":"number"},"currency":{"type":"string","minLength":3,"maxLength":3},"categoryCode":{"type":"string","description":"Stable chart code, e.g. 5200 for Office & rent. Preferred over category name."},"category":{"type":"string"},"source":{"type":"string","enum":["nordea","stripe","manual_csv"]},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string"}}},"NoteRequest":{"type":"object","additionalProperties":false,"required":["transactionId","content"],"properties":{"transactionId":{"type":"string","format":"uuid"},"content":{"type":"string","minLength":1}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}},"responses":{"Unauthorized":{"description":"Missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Insufficient token scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationError":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"externalDocs":{"description":"Agent skill + llms.txt map","url":"https://bennybooks.com/skill.md"}}