{"openapi":"3.1.0","info":{"title":"PUT /api/v1/posting-defaults","version":"1.0.0","description":"Update invoice posting defaults"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/posting-defaults":{"put":{"tags":["posting-defaults"],"summary":"Update invoice posting defaults","description":"Set the ledger for any of the four invoice posting roles, or send null to go back to the system ledger. Omitted roles are unchanged. Inactive ledgers and ledgers of the wrong account type are refused. Only new postings use the change; entries already posted stay.","operationId":"update_posting_defaults","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-business-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Business-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingDefaultsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_PostingDefaultsResponse_"}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"example":{"error":"validation_error","message":"Validation failed: due_date: Input should be a valid date","errors":{"due_date":"Input should be a valid date"},"code":"GEN_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Missing or expired token, an MCP OAuth token used against the REST API, or no access to this business","content":{"application/json":{"example":{"error":"unauthorized","message":"Authentication required","code":"AUTH_001","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"error":"forbidden","message":"You don't have permission to access this resource","code":"AUTH_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"error":"not_found","message":"Resource not found","code":"NOT_FOUND_001","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"validation_error","message":"Validation failed: amount: Input should be a valid integer","errors":{"amount":"Input should be a valid integer"},"code":"GEN_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"}}}}},"x-fastapi-operation-id":"update_posting_defaults_api_v1_posting_defaults_put"}}},"components":{"schemas":{"PostingDefaultEntry":{"properties":{"role":{"type":"string","title":"Role"},"system_key":{"type":"string","title":"System Key"},"ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ledger Id"},"ledger_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ledger Name"},"ledger_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ledger Active"}},"type":"object","required":["role","system_key"],"title":"PostingDefaultEntry","description":"One posting role: the configured ledger and the system one it replaces."},"PostingDefaultsResponse":{"properties":{"invoice_sales_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Sales Ledger Id"},"invoice_cogs_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Cogs Ledger Id"},"invoice_inventory_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Inventory Ledger Id"},"invoice_ar_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Ar Ledger Id"},"entries":{"items":{"$ref":"#/components/schemas/PostingDefaultEntry"},"type":"array","title":"Entries"},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"PostingDefaultsResponse"},"PostingDefaultsUpdate":{"properties":{"invoice_sales_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Sales Ledger Id","description":"Revenue ledger credited by invoices"},"invoice_cogs_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Cogs Ledger Id","description":"Expense ledger debited for cost of goods sold"},"invoice_inventory_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Inventory Ledger Id","description":"Asset ledger credited when inventory is relieved"},"invoice_ar_ledger_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Ar Ledger Id","description":"Asset ledger debited for the receivable"}},"type":"object","title":"PostingDefaultsUpdate","description":"Ledgers invoices post to. Omit a field to leave it as is; send null to\ngo back to the system ledger."},"SuccessEnvelope_PostingDefaultsResponse_":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"data":{"anyOf":[{"$ref":"#/components/schemas/PostingDefaultsResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[PostingDefaultsResponse]"},"ErrorResponse":{"title":"ErrorResponse","type":"object","description":"Envelope returned by every non-2xx response. Branch on `code` (stable) rather than `message` (human-readable, may change).","required":["error","message","code"],"properties":{"error":{"type":"string","description":"Error category: `validation_error`, `unauthorized`, `forbidden`, `not_found`, `conflict`, `rate_limited`, `server_error`, or `service_unavailable`."},"message":{"type":"string","description":"Human-readable explanation, safe to show to end users."},"code":{"type":"string","description":"Stable machine-readable code in `CATEGORY_NNN` form (e.g. `NOT_FOUND_006`, `AUTH_010`, `GEN_002`)."},"request_id":{"type":"string","description":"Correlation id for support requests. Echoes the `x-request-id` request header when one was supplied."},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Field-level validation messages keyed by field name. Present on 400/422 validation failures only."}}}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}