{"openapi":"3.1.0","info":{"title":"Peil API","description":"Peil — hours, invoicing and financial orientation for Dutch freelancers. Scoped API keys (Settings → Developer) reach the curated public surface: time-entry list/create, client and project lists, invoice list/create, unbilled-entries, from-hours drafting, send-email and the orientation snapshot. Scopes: read, timesheet:write, invoices:write, invoices:send. All other routes require a session (JWT).","version":"2.0.0"},"paths":{"/api/v1/clients":{"get":{"tags":["clients","clients"],"summary":"Read Clients","operationId":"read_clients_api_v1_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Client"},"type":"array","title":"Response Read Clients Api V1 Clients Get"}}}}}},"post":{"tags":["clients","clients"],"summary":"Create Client","operationId":"create_client_api_v1_clients_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/":{"get":{"tags":["clients","clients"],"summary":"Read Clients","operationId":"read_clients_api_v1_clients__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Client"},"type":"array","title":"Response Read Clients Api V1 Clients  Get"}}}}}},"post":{"tags":["clients","clients"],"summary":"Create Client","operationId":"create_client_api_v1_clients__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/kvk-detail/{kvk_nummer}":{"get":{"tags":["clients","clients"],"summary":"Kvk Detail","operationId":"kvk_detail_api_v1_clients_kvk_detail__kvk_nummer__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"kvk_nummer","in":"path","required":true,"schema":{"type":"string","title":"Kvk Nummer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/kvk-suggest":{"get":{"tags":["clients","clients"],"summary":"Kvk Suggest","operationId":"kvk_suggest_api_v1_clients_kvk_suggest_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{client_id}/":{"get":{"tags":["clients","clients"],"summary":"Read Client","operationId":"read_client_api_v1_clients__client_id___get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["clients","clients"],"summary":"Update Client","operationId":"update_client_api_v1_clients__client_id___put","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clients","clients"],"summary":"Delete Client","operationId":"delete_client_api_v1_clients__client_id___delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{client_id}":{"get":{"tags":["clients","clients"],"summary":"Read Client","operationId":"read_client_api_v1_clients__client_id__get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["clients","clients"],"summary":"Update Client","operationId":"update_client_api_v1_clients__client_id__put","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clients","clients"],"summary":"Delete Client","operationId":"delete_client_api_v1_clients__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{client_id}/rate-history/":{"get":{"tags":["clients","clients"],"summary":"Get Client Rate History","description":"Return rate history derived from actual billable time entries for this client.\n\nGroups entries by distinct rate value and returns first_used / last_used dates,\nentry count, and total hours per rate — sorted most-recent first.","operationId":"get_client_rate_history_api_v1_clients__client_id__rate_history__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{client_id}/rate-history":{"get":{"tags":["clients","clients"],"summary":"Get Client Rate History","description":"Return rate history derived from actual billable time entries for this client.\n\nGroups entries by distinct rate value and returns first_used / last_used dates,\nentry count, and total hours per rate — sorted most-recent first.","operationId":"get_client_rate_history_api_v1_clients__client_id__rate_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoices","operationId":"read_invoices_api_v1_invoices_get","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"},"title":"Response Read Invoices Api V1 Invoices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["invoices","invoices"],"summary":"Create Invoice","operationId":"create_invoice_api_v1_invoices_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoices","operationId":"read_invoices_api_v1_invoices__get","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"},"title":"Response Read Invoices Api V1 Invoices  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["invoices","invoices"],"summary":"Create Invoice","operationId":"create_invoice_api_v1_invoices__post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/next-number":{"get":{"tags":["invoices","invoices"],"summary":"Get Next Invoice Number","description":"Generate the next invoice number based on user's format settings.","operationId":"get_next_invoice_number_api_v1_invoices_next_number_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/invoices/invoice-settings":{"get":{"tags":["invoices","invoices"],"summary":"Get Invoice Settings","description":"Return invoice-related settings (number format, payment terms).","operationId":"get_invoice_settings_api_v1_invoices_invoice_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["invoices","invoices"],"summary":"Update Invoice Settings","description":"Update invoice-related settings. Body: { number_format?, default_payment_terms? }","operationId":"update_invoice_settings_api_v1_invoices_invoice_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/invoices/reminder-settings":{"get":{"tags":["invoices","invoices"],"summary":"Get Reminder Settings","description":"Return auto-reminder settings with defaults.","operationId":"get_reminder_settings_api_v1_invoices_reminder_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["invoices","invoices"],"summary":"Update Reminder Settings","description":"Update reminder consent, schedule, and optional custom templates.","operationId":"update_reminder_settings_api_v1_invoices_reminder_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/email-history":{"get":{"tags":["invoices","invoices"],"summary":"Get Email History","description":"Consolidated history of outbound invoice emails and their delivery status\nacross all of the user's invoices — the full record behind the per-invoice\ntimeline and the dashboard's capped ledger. Reverse-chronological, paginated.","operationId":"get_email_history_api_v1_invoices_email_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/recurring-status":{"get":{"tags":["invoices","invoices"],"summary":"Get Recurring Status","description":"Return all active retainer projects with their current-month invoice state.\n\nOne query for retainer projects + one query for this month's invoices,\njoined in Python. No N+1.","operationId":"get_recurring_status_api_v1_invoices_recurring_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/invoices/unbilled-entries":{"get":{"tags":["invoices","invoices"],"summary":"Get Unbilled Entries","description":"Return billable time entries not yet attached to any invoice.","operationId":"get_unbilled_entries_api_v1_invoices_unbilled_entries_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start"}},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/from-hours":{"post":{"tags":["invoices","invoices"],"summary":"Create Invoice From Hours","description":"Compose a DRAFT invoice from unbilled hours for a client + period.\n\nThe agent-natural intent verb: gathers unbilled billable entries, builds\nline items (summary | by_project | per_day), creates a draft, and links\nthe entries. Never sends — sending is a separate, separately-scoped call.","operationId":"create_invoice_from_hours_api_v1_invoices_from_hours_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceFromHoursRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceFromHoursResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/preview-pdf":{"post":{"tags":["invoices","invoices"],"summary":"Preview Invoice Pdf","description":"Render a PDF from unsaved form data — for live split-pane preview.","operationId":"preview_invoice_pdf_api_v1_invoices_preview_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/invoices/preview-svg":{"post":{"tags":["invoices","invoices"],"summary":"Preview Invoice Svg","description":"Render an SVG preview from unsaved form data — for live split-pane preview.","operationId":"preview_invoice_svg_api_v1_invoices_preview_svg_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/invoices/{invoice_id}/pdf":{"get":{"tags":["invoices","invoices"],"summary":"Download Invoice Pdf","description":"Download invoice as PDF. Serves stored file for finalized invoices; regenerates for drafts.","operationId":"download_invoice_pdf_api_v1_invoices__invoice_id__pdf_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/generate-next":{"post":{"tags":["invoices","invoices"],"summary":"Generate Next Recurring Invoice","description":"Generate the next draft invoice in a recurring series.","operationId":"generate_next_recurring_invoice_api_v1_invoices__invoice_id__generate_next_post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/schedule-send":{"post":{"tags":["invoices","invoices"],"summary":"Schedule Invoice Send","description":"Set or update the scheduled send time for a draft invoice.","operationId":"schedule_invoice_send_api_v1_invoices__invoice_id__schedule_send_post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["invoices","invoices"],"summary":"Cancel Invoice Schedule","description":"Cancel a scheduled send.","operationId":"cancel_invoice_schedule_api_v1_invoices__invoice_id__schedule_send_delete","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoice","operationId":"read_invoice_api_v1_invoices__invoice_id___get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["invoices","invoices"],"summary":"Update Invoice","operationId":"update_invoice_api_v1_invoices__invoice_id___put","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["invoices","invoices"],"summary":"Delete Invoice","operationId":"delete_invoice_api_v1_invoices__invoice_id___delete","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoice","operationId":"read_invoice_api_v1_invoices__invoice_id__get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["invoices","invoices"],"summary":"Update Invoice","operationId":"update_invoice_api_v1_invoices__invoice_id__put","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["invoices","invoices"],"summary":"Delete Invoice","operationId":"delete_invoice_api_v1_invoices__invoice_id__delete","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/time-entries/":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoice Time Entries","operationId":"read_invoice_time_entries_api_v1_invoices__invoice_id__time_entries__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/time-entries":{"get":{"tags":["invoices","invoices"],"summary":"Read Invoice Time Entries","operationId":"read_invoice_time_entries_api_v1_invoices__invoice_id__time_entries_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/events":{"get":{"tags":["invoices","invoices"],"summary":"Get Invoice Events","description":"Return invoice event history, most recent first.","operationId":"get_invoice_events_api_v1_invoices__invoice_id__events_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/archive/":{"post":{"tags":["invoices","invoices"],"summary":"Archive Invoice","description":"Archive a paid or draft invoice. Archived invoices are hidden from default views.","operationId":"archive_invoice_api_v1_invoices__invoice_id__archive__post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/archive":{"post":{"tags":["invoices","invoices"],"summary":"Archive Invoice","description":"Archive a paid or draft invoice. Archived invoices are hidden from default views.","operationId":"archive_invoice_api_v1_invoices__invoice_id__archive_post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/send-email":{"post":{"tags":["invoices","invoices"],"summary":"Send Invoice Email","description":"Send invoice by email via Resend. Transitions draft → sent. Stores email tracking fields.","operationId":"send_invoice_email_api_v1_invoices__invoice_id__send_email_post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/send-reminder":{"post":{"tags":["invoices","invoices"],"summary":"Send Invoice Reminder Email","description":"Send a manual payment reminder. Invoice must be sent/overdue and have a client email.","operationId":"send_invoice_reminder_email_api_v1_invoices__invoice_id__send_reminder_post","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invoices/{invoice_id}/mark-reminder-sent":{"post":{"tags":["invoices","invoices"],"summary":"Mark Reminder Sent","description":"Record that a reminder was sent outside Peil (no email sent — event log only).","operationId":"mark_reminder_sent_api_v1_invoices__invoice_id__mark_reminder_sent_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries":{"get":{"tags":["time_entries","time_entries"],"summary":"Read Time Entries","operationId":"read_time_entries_api_v1_time_entries_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry"},"title":"Response Read Time Entries Api V1 Time Entries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["time_entries","time_entries"],"summary":"Create Time Entry","operationId":"create_time_entry_api_v1_time_entries_post","parameters":[{"name":"if_day_empty","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"If Day Empty"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/":{"get":{"tags":["time_entries","time_entries"],"summary":"Read Time Entries","operationId":"read_time_entries_api_v1_time_entries__get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry"},"title":"Response Read Time Entries Api V1 Time Entries  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["time_entries","time_entries"],"summary":"Create Time Entry","operationId":"create_time_entry_api_v1_time_entries__post","parameters":[{"name":"if_day_empty","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"If Day Empty"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/summary":{"get":{"tags":["time_entries","time_entries"],"summary":"Get Monthly Time Entries Summary","operationId":"get_monthly_time_entries_summary_api_v1_time_entries_summary_get","parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":true,"schema":{"type":"integer","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyTimeEntriesSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/bulk-create":{"post":{"tags":["time_entries","time_entries"],"summary":"Bulk Create Time Entries","description":"Create many rows in one request — what paste, duplicate and undo send.\n\nEach row is created on its own, exactly as `POST /time_entries` would, and a\nrow that fails does not stop the rest (the grid reports how many failed).\nBefore this, the grid sent one POST per row at once: a month pasted was 20\nsimultaneous requests, and more than 60 in a minute hit that route's limit.","operationId":"bulk_create_time_entries_api_v1_time_entries_bulk_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryBulkCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/{time_entry_id}/":{"get":{"tags":["time_entries","time_entries"],"summary":"Read Time Entry","operationId":"read_time_entry_api_v1_time_entries__time_entry_id___get","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["time_entries","time_entries"],"summary":"Update Time Entry","operationId":"update_time_entry_api_v1_time_entries__time_entry_id___put","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["time_entries","time_entries"],"summary":"Delete Time Entry","operationId":"delete_time_entry_api_v1_time_entries__time_entry_id___delete","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/{time_entry_id}":{"get":{"tags":["time_entries","time_entries"],"summary":"Read Time Entry","operationId":"read_time_entry_api_v1_time_entries__time_entry_id__get","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["time_entries","time_entries"],"summary":"Update Time Entry","operationId":"update_time_entry_api_v1_time_entries__time_entry_id__put","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["time_entries","time_entries"],"summary":"Delete Time Entry","operationId":"delete_time_entry_api_v1_time_entries__time_entry_id__delete","parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/bulk-delete-by-id":{"post":{"tags":["time_entries","time_entries"],"summary":"Bulk Delete Time Entries By Id","description":"Delete a selection in one request; each id is checked as\n`DELETE /time_entries/{id}` would check it, and one locked row does not stop\nthe others (409s come back per id).","operationId":"bulk_delete_time_entries_by_id_api_v1_time_entries_bulk_delete_by_id_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryBulkDeleteById"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/bulk-update-status":{"post":{"tags":["time_entries","time_entries"],"summary":"Bulk Update Time Entry Status","operationId":"bulk_update_time_entry_status_api_v1_time_entries_bulk_update_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryBulkUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time_entries/bulk-delete":{"post":{"tags":["time_entries","time_entries"],"summary":"Bulk Delete Time Entries","operationId":"bulk_delete_time_entries_api_v1_time_entries_bulk_delete_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryBulkDelete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activities":{"get":{"tags":["activities","activities"],"summary":"Read Activities","operationId":"read_activities_api_v1_activities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Activity"},"type":"array","title":"Response Read Activities Api V1 Activities Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["activities","activities"],"summary":"Create Activity","operationId":"create_activity_api_v1_activities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/activities/":{"get":{"tags":["activities","activities"],"summary":"Read Activities","operationId":"read_activities_api_v1_activities__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Activity"},"type":"array","title":"Response Read Activities Api V1 Activities  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["activities","activities"],"summary":"Create Activity","operationId":"create_activity_api_v1_activities__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/activities/{activity_id}/":{"get":{"tags":["activities","activities"],"summary":"Read Activity","operationId":"read_activity_api_v1_activities__activity_id___get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["activities","activities"],"summary":"Update Activity","operationId":"update_activity_api_v1_activities__activity_id___put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activities","activities"],"summary":"Delete Activity","operationId":"delete_activity_api_v1_activities__activity_id___delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activities/{activity_id}":{"get":{"tags":["activities","activities"],"summary":"Read Activity","operationId":"read_activity_api_v1_activities__activity_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["activities","activities"],"summary":"Update Activity","operationId":"update_activity_api_v1_activities__activity_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activities","activities"],"summary":"Delete Activity","operationId":"delete_activity_api_v1_activities__activity_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/non-billable-activities":{"get":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Read Non Billable Activities","operationId":"read_non_billable_activities_api_v1_non_billable_activities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NonBillableActivity"},"type":"array","title":"Response Read Non Billable Activities Api V1 Non Billable Activities Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Create Non Billable Activity","operationId":"create_non_billable_activity_api_v1_non_billable_activities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivityCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/non-billable-activities/":{"get":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Read Non Billable Activities","operationId":"read_non_billable_activities_api_v1_non_billable_activities__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NonBillableActivity"},"type":"array","title":"Response Read Non Billable Activities Api V1 Non Billable Activities  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Create Non Billable Activity","operationId":"create_non_billable_activity_api_v1_non_billable_activities__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivityCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/non-billable-activities/by-category/{category}":{"get":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Read Non Billable Activities By Category","operationId":"read_non_billable_activities_by_category_api_v1_non_billable_activities_by_category__category__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"path","required":true,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NonBillableActivity"},"title":"Response Read Non Billable Activities By Category Api V1 Non Billable Activities By Category  Category  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/non-billable-activities/{activity_id}":{"get":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Read Non Billable Activity","operationId":"read_non_billable_activity_api_v1_non_billable_activities__activity_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Update Non Billable Activity","operationId":"update_non_billable_activity_api_v1_non_billable_activities__activity_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonBillableActivity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Delete Non Billable Activity","operationId":"delete_non_billable_activity_api_v1_non_billable_activities__activity_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"integer","title":"Activity Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/non-billable-activities/suggestions":{"get":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Get Activity Suggestions","description":"Get suggestions for generic internal activities that count towards urencriterium","operationId":"get_activity_suggestions_api_v1_non_billable_activities_suggestions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Activity Suggestions Api V1 Non Billable Activities Suggestions Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/non-billable-activities/seed-defaults":{"post":{"tags":["non-billable-activities","non-billable-activities"],"summary":"Seed Default Non Billable Activities","description":"Seed default non-billable activities based on Dutch tax law","operationId":"seed_default_non_billable_activities_api_v1_non_billable_activities_seed_defaults_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/tax_periods/":{"get":{"tags":["tax_periods","tax_periods"],"summary":"Read Tax Periods","operationId":"read_tax_periods_api_v1_tax_periods__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TaxPeriod"},"type":"array","title":"Response Read Tax Periods Api V1 Tax Periods  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["tax_periods","tax_periods"],"summary":"Create Tax Period","operationId":"create_tax_period_api_v1_tax_periods__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxPeriodCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxPeriod"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/tax_periods/{tax_period_id}":{"get":{"tags":["tax_periods","tax_periods"],"summary":"Read Tax Period","operationId":"read_tax_period_api_v1_tax_periods__tax_period_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tax_period_id","in":"path","required":true,"schema":{"type":"integer","title":"Tax Period Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxPeriod"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tax_periods","tax_periods"],"summary":"Update Tax Period","operationId":"update_tax_period_api_v1_tax_periods__tax_period_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tax_period_id","in":"path","required":true,"schema":{"type":"integer","title":"Tax Period Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxPeriodCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxPeriod"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tax_periods","tax_periods"],"summary":"Delete Tax Period","operationId":"delete_tax_period_api_v1_tax_periods__tax_period_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tax_period_id","in":"path","required":true,"schema":{"type":"integer","title":"Tax Period Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rates":{"get":{"tags":["rates","rates"],"summary":"Read Rates","description":"Get all rates with optional filtering","operationId":"read_rates_api_v1_rates_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"activity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Active Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RateWithClient"},"title":"Response Read Rates Api V1 Rates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["rates","rates"],"summary":"Create Rate","description":"Create a new rate","operationId":"create_rate_api_v1_rates_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rates/":{"get":{"tags":["rates","rates"],"summary":"Read Rates","description":"Get all rates with optional filtering","operationId":"read_rates_api_v1_rates__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"activity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Active Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RateWithClient"},"title":"Response Read Rates Api V1 Rates  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["rates","rates"],"summary":"Create Rate","description":"Create a new rate","operationId":"create_rate_api_v1_rates__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rates/adopt":{"post":{"tags":["rates","rates"],"summary":"Adopt Entry Rate","description":"The timesheet's inline rate edit: make it the client's rate from that\nentry's date on (or report why not). See RateService.adopt_entry_rate.","operationId":"adopt_entry_rate_api_v1_rates_adopt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateAdoptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateAdoptResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/rates/{rate_id}":{"get":{"tags":["rates","rates"],"summary":"Read Rate","description":"Get a specific rate by ID","operationId":"read_rate_api_v1_rates__rate_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rate_id","in":"path","required":true,"schema":{"type":"integer","title":"Rate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["rates","rates"],"summary":"Update Rate","description":"Update a specific rate","operationId":"update_rate_api_v1_rates__rate_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rate_id","in":"path","required":true,"schema":{"type":"integer","title":"Rate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["rates","rates"],"summary":"Delete Rate","description":"Delete a specific rate","operationId":"delete_rate_api_v1_rates__rate_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rate_id","in":"path","required":true,"schema":{"type":"integer","title":"Rate Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rates/client/{client_id}/history":{"get":{"tags":["rates","rates"],"summary":"Get Client Rate History","description":"Get rate history for a specific client","operationId":"get_client_rate_history_api_v1_rates_client__client_id__history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateHistory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rates/client/{client_id}/current":{"get":{"tags":["rates","rates"],"summary":"Get Current Client Rate","description":"Get current active rate for a client and activity","operationId":"get_current_client_rate_api_v1_rates_client__client_id__current_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}},{"name":"activity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"}},{"name":"effective_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Rate"},{"type":"null"}],"title":"Response Get Current Client Rate Api V1 Rates Client  Client Id  Current Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/active_projection_rate":{"get":{"tags":["settings"],"summary":"Get Active Projection Rate","description":"Get the active hourly rate used for projections and VAT calculations","operationId":"get_active_projection_rate_api_v1_settings_active_projection_rate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Active Projection Rate Api V1 Settings Active Projection Rate Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["settings"],"summary":"Set Active Projection Rate","description":"Set the active hourly rate for projections and VAT calculations\n\nBody: {\"rate\": 24.0} or {\"rate\": null} to clear manual override","operationId":"set_active_projection_rate_api_v1_settings_active_projection_rate_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Rate Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Active Projection Rate Api V1 Settings Active Projection Rate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/comprehensive":{"get":{"tags":["settings"],"summary":"Get Comprehensive Settings","description":"Get comprehensive settings with full financial, locale, and AOV configuration","operationId":"get_comprehensive_settings_api_v1_settings_comprehensive_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComprehensiveSettings"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["settings"],"summary":"Update Comprehensive Settings","description":"Update specific parts of comprehensive settings. Only the fields sent are\nwritten; everything else stored stays as it is.","operationId":"update_comprehensive_settings_api_v1_settings_comprehensive_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Settings Update"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Comprehensive Settings Api V1 Settings Comprehensive Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["settings"],"summary":"Save Comprehensive Settings","description":"Save comprehensive settings. Merged into what is stored, so the sections\noutside this schema (invoice_pdf, branding, reminders, …) survive.","operationId":"save_comprehensive_settings_api_v1_settings_comprehensive_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComprehensiveSettings"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/invoice-pdf":{"get":{"tags":["settings"],"summary":"Get Invoice Pdf Settings","description":"Get invoice PDF template and branding settings.","operationId":"get_invoice_pdf_settings_api_v1_settings_invoice_pdf_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["settings"],"summary":"Update Invoice Pdf Settings","description":"Update invoice PDF template and branding settings.\n\nThe merge runs under a row lock (merge_json_section) so concurrent saves\nfrom other design tabs can't revert this section — and vice versa.","operationId":"update_invoice_pdf_settings_api_v1_settings_invoice_pdf_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Settings Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/invoice-pdf/preview":{"post":{"tags":["settings"],"summary":"Preview Invoice Pdf Design","description":"Render a sample invoice with the given branding — for the live design editor preview.","operationId":"preview_invoice_pdf_design_api_v1_settings_invoice_pdf_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_InvoicePdfPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/branding":{"get":{"tags":["settings"],"summary":"Get Branding Settings","description":"Raw saved branding + the effective (plan-gated, fallback-resolved) result.","operationId":"get_branding_settings_api_v1_settings_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["settings"],"summary":"Update Branding Settings","description":"Update white-label branding (Pro). Only fields present in the request\nchange, explicit null clears a field. The merge runs under a row lock\n(merge_json_section) so concurrent design-tab saves can't revert it.","operationId":"update_branding_settings_api_v1_settings_branding_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_BrandingUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/ai-key":{"get":{"tags":["settings"],"summary":"Get Ai Key","operationId":"get_ai_key_api_v1_settings_ai_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["settings"],"summary":"Put Ai Key","operationId":"put_ai_key_api_v1_settings_ai_key_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AiKeyUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"delete":{"tags":["settings"],"summary":"Delete Ai Key","operationId":"delete_ai_key_api_v1_settings_ai_key_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/mollie-key":{"get":{"tags":["settings"],"summary":"Get Mollie Key","operationId":"get_mollie_key_api_v1_settings_mollie_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["settings"],"summary":"Put Mollie Key","operationId":"put_mollie_key_api_v1_settings_mollie_key_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_MollieKeyUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"delete":{"tags":["settings"],"summary":"Delete Mollie Key","operationId":"delete_mollie_key_api_v1_settings_mollie_key_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/branding/preview-email":{"post":{"tags":["settings"],"summary":"Preview Branded Email","description":"Render the real invoice email template with sample invoice data and the\nposted (possibly unsaved) branding — for the design editor's live preview.\nPlan-gated like every other branding read path (resolver invariant).","operationId":"preview_branded_email_api_v1_settings_branding_preview_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_EmailPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/invoice-logo":{"post":{"tags":["settings"],"summary":"Upload Invoice Logo","description":"Upload a logo image and store its URL in invoice PDF settings, or — with\n``?target=branding`` — in the white-label branding section.","operationId":"upload_invoice_logo_api_v1_settings_invoice_logo_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"target","in":"query","required":false,"schema":{"type":"string","default":"invoice","title":"Target"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_invoice_logo_api_v1_settings_invoice_logo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/current":{"get":{"tags":["settings"],"summary":"Get Current User Settings","description":"Get settings for the current user","operationId":"get_current_user_settings_api_v1_settings_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/default_hourly_rate":{"get":{"tags":["settings"],"summary":"Get Default Hourly Rate","operationId":"get_default_hourly_rate_api_v1_settings_default_hourly_rate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"number","title":"Response Get Default Hourly Rate Api V1 Settings Default Hourly Rate Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/default_daily_hours":{"get":{"tags":["settings"],"summary":"Get Default Daily Hours","operationId":"get_default_daily_hours_api_v1_settings_default_daily_hours_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"number","title":"Response Get Default Daily Hours Api V1 Settings Default Daily Hours Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/widgets":{"get":{"tags":["settings"],"summary":"Get Widget Settings","description":"Get current widget configuration settings","operationId":"get_widget_settings_api_v1_settings_widgets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetSettings"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["settings"],"summary":"Update Widget Settings","description":"Update widget configuration settings","operationId":"update_widget_settings_api_v1_settings_widgets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetSettings"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Widget Settings Api V1 Settings Widgets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/account/wipe-data":{"post":{"tags":["settings"],"summary":"Wipe User Data","description":"Delete all user data (time entries, clients, projects, invoices, etc.) but keep the account.","operationId":"wipe_user_data_api_v1_settings_account_wipe_data_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wipe User Data Api V1 Settings Account Wipe Data Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/account":{"delete":{"tags":["settings"],"summary":"Schedule Account Deletion","description":"Schedule account deletion with a grace period. Sends a cancellation email.\n\nIf the user has a live Pro subscription, it is cancelled first so a future\npurge cannot orphan a recurring Mollie charge.","operationId":"schedule_account_deletion_api_v1_settings_account_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Schedule Account Deletion Api V1 Settings Account Delete"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/":{"get":{"tags":["settings"],"summary":"Read All Settings","operationId":"read_all_settings_api_v1_settings__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Settings"},"type":"array","title":"Response Read All Settings Api V1 Settings  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["settings"],"summary":"Create Settings","operationId":"create_settings_api_v1_settings__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/setup-checklist":{"get":{"tags":["settings"],"summary":"Setup Checklist","description":"The welcome card's to-dos, and which are done: the steps from a new account to\none that is fully set up. Cheap existence checks, scoped to the user.","operationId":"setup_checklist_api_v1_settings_setup_checklist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/lab-opened":{"post":{"tags":["settings"],"summary":"Lab Opened","description":"The Lab was opened: ticks off the setup step that leads there from the\ndashboard. Stamped once; later visits leave the first date.","operationId":"lab_opened_api_v1_settings_lab_opened_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/{settings_id}":{"get":{"tags":["settings"],"summary":"Read Settings","operationId":"read_settings_api_v1_settings__settings_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"settings_id","in":"path","required":true,"schema":{"type":"integer","title":"Settings Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["settings"],"summary":"Update Settings","operationId":"update_settings_api_v1_settings__settings_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"settings_id","in":"path","required":true,"schema":{"type":"integer","title":"Settings Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["settings"],"summary":"Delete Settings","operationId":"delete_settings_api_v1_settings__settings_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"settings_id","in":"path","required":true,"schema":{"type":"integer","title":"Settings Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/kor":{"patch":{"tags":["settings"],"summary":"Update Kor","description":"Toggle the Kleineondernemersregeling (BTW exemption) setting.","operationId":"update_kor_api_v1_settings_kor_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/startersaftrek":{"patch":{"tags":["settings"],"summary":"Update Startersaftrek","description":"Set the startersaftrek eligibility override: true/false = user assertion,\nnull = automatic (derived from business_start_date).","operationId":"update_startersaftrek_api_v1_settings_startersaftrek_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/attach-ubl":{"patch":{"tags":["settings"],"summary":"Update Attach Ubl","description":"Toggle attaching the UBL (e-invoice) XML alongside the PDF on invoice emails.","operationId":"update_attach_ubl_api_v1_settings_attach_ubl_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/lang":{"patch":{"tags":["settings"],"summary":"Update Lang","description":"Persist the user's UI language preference.","operationId":"update_lang_api_v1_settings_lang_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/bootstrap":{"post":{"tags":["settings"],"summary":"Bootstrap Onboarding","description":"Persist bootstrap inputs from onboarding and mark the user as onboarded.","operationId":"bootstrap_onboarding_api_v1_settings_bootstrap_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/meta/capabilities":{"get":{"tags":["settings"],"summary":"Get Public Capabilities","operationId":"get_public_capabilities_api_v1_settings_meta_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Public Capabilities Api V1 Settings Meta Capabilities Get"}}}}}}},"/api/v1/settings/account/cancel-deletion":{"post":{"tags":["settings"],"summary":"Cancel Account Deletion","description":"Cancel a scheduled account deletion. Public — authenticated by the cancel token from the grace period email.","operationId":"cancel_account_deletion_api_v1_settings_account_cancel_deletion_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Account Deletion Api V1 Settings Account Cancel Deletion Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/resend":{"post":{"tags":["webhooks"],"summary":"Resend Webhook","description":"Handle Resend email lifecycle events.\nSuppresses emails on hard bounce or spam complaint.","operationId":"resend_webhook_api_v1_webhooks_resend_post","parameters":[{"name":"svix-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Id"}},{"name":"svix-timestamp","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Timestamp"}},{"name":"svix-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/mollie":{"post":{"tags":["webhooks"],"summary":"Mollie Webhook","description":"Handle Mollie payment and subscription lifecycle events.","operationId":"mollie_webhook_api_v1_webhooks_mollie_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_mollie_webhook_api_v1_webhooks_mollie_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/mollie/invoice":{"post":{"tags":["webhooks"],"summary":"Mollie Invoice Webhook","description":"Handle an invoice-payment webhook (BYO Mollie key). Unlike /mollie (Peil's\nown subscription billing on the platform key), this reconciles a freelancer's\ninvoice using their stored key — re-fetching the authoritative status from\nMollie before marking the invoice paid. Always 200s so Mollie stops retrying.","operationId":"mollie_invoice_webhook_api_v1_webhooks_mollie_invoice_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_mollie_invoice_webhook_api_v1_webhooks_mollie_invoice_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email/unsubscribe":{"get":{"tags":["email","email"],"summary":"Unsubscribe Page","description":"Browser landing for the footer link. Flips the opt-out and offers to undo.","operationId":"unsubscribe_page_api_v1_email_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["email","email"],"summary":"Unsubscribe Oneclick","description":"RFC 8058 one-click target — the mail client POSTs here directly. No body to\nrender; a 200 is the whole contract.","operationId":"unsubscribe_oneclick_api_v1_email_unsubscribe_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email/resubscribe":{"get":{"tags":["email","email"],"summary":"Resubscribe Page","operationId":"resubscribe_page_api_v1_email_resubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/{token}":{"get":{"tags":["portal","portal"],"summary":"Get Portal","operationId":"get_portal_api_v1_portal__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/{token}/custom":{"get":{"tags":["portal","portal"],"summary":"Get Portal Custom","description":"Superuser-authored portal HTML, rendered via safe {{var}} substitution.\nServed with a strict CSP and embedded by the SPA in a sandboxed iframe —\ndefense in depth even though only superusers author these in v1.","operationId":"get_portal_custom_api_v1_portal__token__custom_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/{token}/invoices/{invoice_id}/pdf":{"get":{"tags":["portal","portal"],"summary":"Get Portal Pdf","operationId":"get_portal_pdf_api_v1_portal__token__invoices__invoice_id__pdf_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/{token}/invoices/{invoice_id}/pay":{"post":{"tags":["portal","portal"],"summary":"Create Portal Payment","description":"Client-initiated Mollie payment for an unpaid invoice. The amount is taken\nfrom the invoice server-side — the (unauthenticated) client can't influence\nit — and the money is collected into the freelancer's own Mollie account.","operationId":"create_portal_payment_api_v1_portal__token__invoices__invoice_id__pay_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/{token}/invoices/{invoice_id}/sync":{"post":{"tags":["portal","portal"],"summary":"Sync Portal Payment","description":"Reconcile one invoice's Mollie payment on demand — called by the portal\nwhen the client returns from checkout, so the status flips without waiting on\nthe async webhook (and works locally where no webhook is delivered).","operationId":"sync_portal_payment_api_v1_portal__token__invoices__invoice_id__sync_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/financial-overview":{"get":{"tags":["dashboard","dashboard"],"summary":"Get Financial Overview","description":"Consolidated financial overview for the focused dashboard","operationId":"get_financial_overview_api_v1_dashboard_financial_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/categories":{"get":{"tags":["expenses","expenses"],"summary":"Get Expense Categories","description":"Category keys with their labels (nl/en) and deductible share.","operationId":"get_expense_categories_api_v1_expenses_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Expense Categories Api V1 Expenses Categories Get"}}}}}}},"/api/v1/expenses/summary":{"get":{"tags":["expenses","expenses"],"summary":"Get Expense Summary","operationId":"get_expense_summary_api_v1_expenses_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/export/csv":{"get":{"tags":["expenses","expenses"],"summary":"Export Expenses Csv","description":"The year's expenses as a CSV file (semicolon-separated, as Dutch Excel expects).","operationId":"export_expenses_csv_api_v1_expenses_export_csv_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":2000,"title":"Year"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(nl|en)$","default":"nl","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses":{"get":{"tags":["expenses","expenses"],"summary":"Read Expenses","operationId":"read_expenses_api_v1_expenses_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"title":"Year"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Expense"},"title":"Response Read Expenses Api V1 Expenses Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["expenses","expenses"],"summary":"Create Expense","operationId":"create_expense_api_v1_expenses_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/":{"get":{"tags":["expenses","expenses"],"summary":"Read Expenses","operationId":"read_expenses_api_v1_expenses__get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"title":"Year"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Expense"},"title":"Response Read Expenses Api V1 Expenses  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["expenses","expenses"],"summary":"Create Expense","operationId":"create_expense_api_v1_expenses__post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/read":{"post":{"tags":["expenses","expenses"],"summary":"Read Receipt","description":"Read the photos or PDF of one receipt into the expense form's fields.\nNothing is saved as an expense: the user confirms the form. Codes in\n`detail`: READING_UNAVAILABLE (503), READING_BUSY (503), READING_LIMIT (429,\nREADINGS_PER_DAY per account), READING_FAILED\n(502), and the file codes (422/413): empty, too_many, too_large,\nunsupported_type, unreadable, image_too_large.","operationId":"read_receipt_api_v1_expenses_read_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_read_receipt_api_v1_expenses_read_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/expenses/{expense_id}":{"get":{"tags":["expenses","expenses"],"summary":"Read Expense","operationId":"read_expense_api_v1_expenses__expense_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["expenses","expenses"],"summary":"Update Expense","operationId":"update_expense_api_v1_expenses__expense_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["expenses","expenses"],"summary":"Delete Expense","operationId":"delete_expense_api_v1_expenses__expense_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/{expense_id}/restore":{"post":{"tags":["expenses","expenses"],"summary":"Restore Expense","description":"Undo a delete: the same row comes back, receipts included.","operationId":"restore_expense_api_v1_expenses__expense_id__restore_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/{expense_id}/receipts":{"post":{"tags":["expenses","expenses"],"summary":"Upload Receipt","description":"Keep a photo or PDF of the receipt. Images are compressed and stripped of\nEXIF (location); PDFs are kept as they are. `detail` on a refusal is a code:\nunsupported_type, too_large, image_too_large, unreadable, empty.","operationId":"upload_receipt_api_v1_expenses__expense_id__receipts_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_receipt_api_v1_expenses__expense_id__receipts_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/expenses/{expense_id}/receipts/{receipt_id}":{"get":{"tags":["expenses","expenses"],"summary":"Download Receipt","operationId":"download_receipt_api_v1_expenses__expense_id__receipts__receipt_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}},{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["expenses","expenses"],"summary":"Delete Receipt","operationId":"delete_receipt_api_v1_expenses__expense_id__receipts__receipt_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"expense_id","in":"path","required":true,"schema":{"type":"integer","title":"Expense Id"}},{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recurring-costs/categories":{"get":{"tags":["recurring-costs","recurring-costs"],"summary":"List Categories","operationId":"list_categories_api_v1_recurring_costs_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recurring-costs/summary":{"get":{"tags":["recurring-costs","recurring-costs"],"summary":"Get Summary","operationId":"get_summary_api_v1_recurring_costs_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCostSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recurring-costs/":{"get":{"tags":["recurring-costs","recurring-costs"],"summary":"List Costs","operationId":"list_costs_api_v1_recurring_costs__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RecurringCost"},"type":"array","title":"Response List Costs Api V1 Recurring Costs  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["recurring-costs","recurring-costs"],"summary":"Create Cost","operationId":"create_cost_api_v1_recurring_costs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCostCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCost"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recurring-costs/{id}":{"get":{"tags":["recurring-costs","recurring-costs"],"summary":"Get Cost","operationId":"get_cost_api_v1_recurring_costs__id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCost"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["recurring-costs","recurring-costs"],"summary":"Update Cost","operationId":"update_cost_api_v1_recurring_costs__id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCostUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCost"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["recurring-costs","recurring-costs"],"summary":"Delete Cost","operationId":"delete_cost_api_v1_recurring_costs__id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recurring-costs/{id}/restore":{"post":{"tags":["recurring-costs","recurring-costs"],"summary":"Restore Cost","description":"Undo a delete: the same cost comes back, receipts included (kept a day).","operationId":"restore_cost_api_v1_recurring_costs__id__restore_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringCost"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recurring-costs/{id}/receipts":{"post":{"tags":["recurring-costs","recurring-costs"],"summary":"Upload Receipt","description":"Keep an invoice with a recurring cost (images compressed, EXIF and\nlocation stripped; PDFs as they are). Same refusal codes as expenses.","operationId":"upload_receipt_api_v1_recurring_costs__id__receipts_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_receipt_api_v1_recurring_costs__id__receipts_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recurring-costs/{id}/receipts/{receipt_id}":{"get":{"tags":["recurring-costs","recurring-costs"],"summary":"Download Receipt","operationId":"download_receipt_api_v1_recurring_costs__id__receipts__receipt_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}},{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["recurring-costs","recurring-costs"],"summary":"Delete Receipt","operationId":"delete_receipt_api_v1_recurring_costs__id__receipts__receipt_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","title":"Id"}},{"name":"receipt_id","in":"path","required":true,"schema":{"type":"integer","title":"Receipt Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects":{"get":{"tags":["projects","projects"],"summary":"Read Projects","operationId":"read_projects_api_v1_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Project"},"type":"array","title":"Response Read Projects Api V1 Projects Get"}}}}}},"post":{"tags":["projects","projects"],"summary":"Create Project","operationId":"create_project_api_v1_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/projects/":{"get":{"tags":["projects","projects"],"summary":"Read Projects","operationId":"read_projects_api_v1_projects__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Project"},"type":"array","title":"Response Read Projects Api V1 Projects  Get"}}}}}},"post":{"tags":["projects","projects"],"summary":"Create Project","operationId":"create_project_api_v1_projects__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/projects/by-client/{client_id}":{"get":{"tags":["projects","projects"],"summary":"Read Projects By Client","operationId":"read_projects_by_client_api_v1_projects_by_client__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project"},"title":"Response Read Projects By Client Api V1 Projects By Client  Client Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/invoiceable-fixed":{"get":{"tags":["projects","projects"],"summary":"Get Invoiceable Fixed Projects","description":"Return fixed-price projects that have uninvoiced budget remaining.\n\nOne query for fixed projects + one aggregation query for invoiced totals,\njoined in Python. No N+1.","operationId":"get_invoiceable_fixed_projects_api_v1_projects_invoiceable_fixed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/projects/{project_id}/budget-burn/":{"get":{"tags":["projects","projects"],"summary":"Get Project Budget Burn","description":"Return invoice-based budget burn for a fixed-price project.\n\nbilled_total: sum of subtotals for sent+paid+archived invoices\npaid_total: sum of subtotals for paid+archived invoices","operationId":"get_project_budget_burn_api_v1_projects__project_id__budget_burn__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/budget-burn":{"get":{"tags":["projects","projects"],"summary":"Get Project Budget Burn","description":"Return invoice-based budget burn for a fixed-price project.\n\nbilled_total: sum of subtotals for sent+paid+archived invoices\npaid_total: sum of subtotals for paid+archived invoices","operationId":"get_project_budget_burn_api_v1_projects__project_id__budget_burn_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/":{"get":{"tags":["projects","projects"],"summary":"Read Project","operationId":"read_project_api_v1_projects__project_id___get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["projects","projects"],"summary":"Update Project","operationId":"update_project_api_v1_projects__project_id___put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects","projects"],"summary":"Delete Project","operationId":"delete_project_api_v1_projects__project_id___delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}":{"get":{"tags":["projects","projects"],"summary":"Read Project","operationId":"read_project_api_v1_projects__project_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["projects","projects"],"summary":"Update Project","operationId":"update_project_api_v1_projects__project_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects","projects"],"summary":"Delete Project","operationId":"delete_project_api_v1_projects__project_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/costs-overview":{"get":{"tags":["financials","financials"],"summary":"Get Costs Overview","description":"The year's costs and deductions so far (the Kosten page's figures), plus\nthe projection: how much lower they make the profit and what they save in\nprojected tax. See app/services/cost_overview.py.","operationId":"get_costs_overview_api_v1_financials_costs_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/lab":{"get":{"tags":["financials","financials"],"summary":"Get Financials Lab","operationId":"get_financials_lab_api_v1_financials_lab_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}},{"name":"use_projection","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Use Projection"}},{"name":"seed","in":"query","required":false,"schema":{"enum":["auto","intake"],"type":"string","default":"auto","title":"Seed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["financials","financials"],"summary":"Post Financials Lab","operationId":"post_financials_lab_api_v1_financials_lab_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}},{"name":"use_projection","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Use Projection"}},{"name":"seed","in":"query","required":false,"schema":{"enum":["auto","intake"],"type":"string","default":"auto","title":"Seed"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialLabOverrides"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/lab/curves":{"post":{"tags":["financials","financials"],"summary":"Post Financials Lab Curves","description":"Sweep hourly rate and hours to generate curve data revealing non-linearities.","operationId":"post_financials_lab_curves_api_v1_financials_lab_curves_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabCurvesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/lab-parity":{"get":{"tags":["financials","financials"],"summary":"Get Lab Parity","description":"Compare dashboard engine inputs vs Lab default inputs for the same year.","operationId":"get_lab_parity_api_v1_financials_lab_parity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/lab-parity-debug":{"get":{"tags":["financials","financials"],"summary":"Get Lab Parity Debug","description":"One-shot diagnostic: compare dashboard vs lab engine annual summaries.","operationId":"get_lab_parity_debug_api_v1_financials_lab_parity_debug_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"default":2026,"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/bootstrap-preview":{"post":{"tags":["financials","financials"],"summary":"Post Bootstrap Preview","description":"Lightweight NER preview from bootstrap inputs. No stored state read or written.","operationId":"post_bootstrap_preview_api_v1_financials_bootstrap_preview_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"title":"Year"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/financials/bootstrap-preview/public":{"post":{"tags":["financials","financials"],"summary":"Post Bootstrap Preview Public","description":"The same preview for a visitor without an account (the intake on /intake, before\nregistering). Default tax parameters, no database. Rate-limited per IP; the\nintake asks again ~0.4 s after each change, so the limit leaves room to play.","operationId":"post_bootstrap_preview_public_api_v1_financials_bootstrap_preview_public_post","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","maximum":2100,"minimum":2000,"title":"Year"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootstrapPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/import/analyze/":{"post":{"tags":["import","import"],"summary":"Analyze Csv","operationId":"analyze_csv_api_v1_import_analyze__post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_csv_api_v1_import_analyze__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/analyze":{"post":{"tags":["import","import"],"summary":"Analyze Csv","operationId":"analyze_csv_api_v1_import_analyze_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_csv_api_v1_import_analyze_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/preview/":{"post":{"tags":["import","import"],"summary":"Preview Import","operationId":"preview_import_api_v1_import_preview__post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_import_api_v1_import_preview__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/preview":{"post":{"tags":["import","import"],"summary":"Preview Import","operationId":"preview_import_api_v1_import_preview_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_import_api_v1_import_preview_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/execute/":{"post":{"tags":["import","import"],"summary":"Execute Import","operationId":"execute_import_api_v1_import_execute__post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_execute_import_api_v1_import_execute__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/execute":{"post":{"tags":["import","import"],"summary":"Execute Import","operationId":"execute_import_api_v1_import_execute_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_execute_import_api_v1_import_execute_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/ubl/preview/":{"post":{"tags":["import","import"],"summary":"Preview Ubl Import","description":"Dry-run: parse each UBL file and report what an import would do\n(fields, client match, duplicate flag) without persisting anything.","operationId":"preview_ubl_import_api_v1_import_ubl_preview__post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_ubl_import_api_v1_import_ubl_preview__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/ubl/preview":{"post":{"tags":["import","import"],"summary":"Preview Ubl Import","description":"Dry-run: parse each UBL file and report what an import would do\n(fields, client match, duplicate flag) without persisting anything.","operationId":"preview_ubl_import_api_v1_import_ubl_preview_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_ubl_import_api_v1_import_ubl_preview_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/ubl/execute/":{"post":{"tags":["import","import"],"summary":"Execute Ubl Import","description":"Create invoices (and clients as needed) from uploaded UBL files.\n``mark_as`` = 'paid' (historical revenue, default) or 'sent' (outstanding).\nDuplicates by invoice number are skipped; parse failures are reported.","operationId":"execute_ubl_import_api_v1_import_ubl_execute__post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_execute_ubl_import_api_v1_import_ubl_execute__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/ubl/execute":{"post":{"tags":["import","import"],"summary":"Execute Ubl Import","description":"Create invoices (and clients as needed) from uploaded UBL files.\n``mark_as`` = 'paid' (historical revenue, default) or 'sent' (outstanding).\nDuplicates by invoice number are skipped; parse failures are reported.","operationId":"execute_ubl_import_api_v1_import_ubl_execute_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_execute_ubl_import_api_v1_import_ubl_execute_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/history/":{"get":{"tags":["import","import"],"summary":"Get Import History","operationId":"get_import_history_api_v1_import_history__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ImportEventOut"},"type":"array","title":"Response Get Import History Api V1 Import History  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/history":{"get":{"tags":["import","import"],"summary":"Get Import History","operationId":"get_import_history_api_v1_import_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ImportEventOut"},"type":"array","title":"Response Get Import History Api V1 Import History Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/import/history/{event_id}":{"delete":{"tags":["import","import"],"summary":"Delete Import Event","operationId":"delete_import_event_api_v1_import_history__event_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/clients/":{"get":{"tags":["export","export"],"summary":"Export Clients","description":"Export all clients for the authenticated user.","operationId":"export_clients_api_v1_export_clients__get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/clients":{"get":{"tags":["export","export"],"summary":"Export Clients","description":"Export all clients for the authenticated user.","operationId":"export_clients_api_v1_export_clients_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/time-entries/":{"get":{"tags":["export","export"],"summary":"Export Time Entries","description":"Export time entries for the authenticated user, optionally filtered.","operationId":"export_time_entries_api_v1_export_time_entries__get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv)$","default":"csv","title":"Format"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/time-entries":{"get":{"tags":["export","export"],"summary":"Export Time Entries","description":"Export time entries for the authenticated user, optionally filtered.","operationId":"export_time_entries_api_v1_export_time_entries_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv)$","default":"csv","title":"Format"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices/":{"get":{"tags":["export","export"],"summary":"Export Invoices","description":"Export invoices for the authenticated user, optionally filtered by year.","operationId":"export_invoices_api_v1_export_invoices__get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices":{"get":{"tags":["export","export"],"summary":"Export Invoices","description":"Export invoices for the authenticated user, optionally filtered by year.","operationId":"export_invoices_api_v1_export_invoices_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoice-history/":{"get":{"tags":["export","export"],"summary":"Export Invoice History","description":"Export the full invoice history (draft/sending, email delivery\nlifecycle, portal views/clicks) for the authenticated user.\n\nThe record freelancers keep for invoice disputes and client-reliability\nsignals — an event log complementing the invoice-metadata CSV.","operationId":"export_invoice_history_api_v1_export_invoice_history__get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoice-history":{"get":{"tags":["export","export"],"summary":"Export Invoice History","description":"Export the full invoice history (draft/sending, email delivery\nlifecycle, portal views/clicks) for the authenticated user.\n\nThe record freelancers keep for invoice disputes and client-reliability\nsignals — an event log complementing the invoice-metadata CSV.","operationId":"export_invoice_history_api_v1_export_invoice_history_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|json)$","default":"csv","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices/{invoice_id}/ubl/":{"get":{"tags":["export","export"],"summary":"Export Invoice Ubl","description":"Export a single invoice as UBL 2.1 / Peppol BIS Billing 3.0 XML.\n\nThe universal write path — the resulting file imports into Dutch\nbookkeeping tools and underpins Peppol / B2G e-invoicing. Available over\nboth JWT and API key (``current_user_or_api_key``) so it is API-first.","operationId":"export_invoice_ubl_api_v1_export_invoices__invoice_id__ubl__get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices/{invoice_id}/ubl":{"get":{"tags":["export","export"],"summary":"Export Invoice Ubl","description":"Export a single invoice as UBL 2.1 / Peppol BIS Billing 3.0 XML.\n\nThe universal write path — the resulting file imports into Dutch\nbookkeeping tools and underpins Peppol / B2G e-invoicing. Available over\nboth JWT and API key (``current_user_or_api_key``) so it is API-first.","operationId":"export_invoice_ubl_api_v1_export_invoices__invoice_id__ubl_get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices/archive/":{"get":{"tags":["export","export"],"summary":"Export Invoices Archive","description":"Stream a ZIP of invoices for the authenticated user.\n\n``format`` selects what each invoice contributes: ``pdf`` (default),\n``ubl`` (UBL 2.1 / Peppol BIS XML), or ``both``. Optionally filtered by\n?year=YYYY or ?invoice_ids=1,2,3. Stored PDFs are served directly; UBL is\ngenerated on the fly. Individual failures are skipped with a log warning.\nUBL is only produced for numbered invoices (BT-1). Returns 404 if empty.","operationId":"export_invoices_archive_api_v1_export_invoices_archive__get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"invoice_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated invoice IDs","title":"Invoice Ids"},"description":"Comma-separated invoice IDs"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(pdf|ubl|both)$","default":"pdf","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/invoices/archive":{"get":{"tags":["export","export"],"summary":"Export Invoices Archive","description":"Stream a ZIP of invoices for the authenticated user.\n\n``format`` selects what each invoice contributes: ``pdf`` (default),\n``ubl`` (UBL 2.1 / Peppol BIS XML), or ``both``. Optionally filtered by\n?year=YYYY or ?invoice_ids=1,2,3. Stored PDFs are served directly; UBL is\ngenerated on the fly. Individual failures are skipped with a log warning.\nUBL is only produced for numbered invoices (BT-1). Returns 404 if empty.","operationId":"export_invoices_archive_api_v1_export_invoices_archive_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"invoice_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated invoice IDs","title":"Invoice Ids"},"description":"Comma-separated invoice IDs"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(pdf|ubl|both)$","default":"pdf","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/full/":{"get":{"tags":["export","export"],"summary":"Export Full","description":"Stream a full-data export ZIP for the authenticated user.\n\nContains:\n  - clients.csv\n  - time-entries.csv\n  - invoices.csv\n  - invoice-history.csv  (full event log: sending, delivery, portal views)\n  - expenses.csv + expense-lines.csv + receipts/  (every expense, the lines read off its receipt, and the receipt files Peil keeps)\n  - invoices/<invoice_number>.pdf  (one per non-draft invoice; failures skipped)\n  - settings.json\n\nThe ZIP is always returned even if all PDF generations fail.","operationId":"export_full_api_v1_export_full__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/export/full":{"get":{"tags":["export","export"],"summary":"Export Full","description":"Stream a full-data export ZIP for the authenticated user.\n\nContains:\n  - clients.csv\n  - time-entries.csv\n  - invoices.csv\n  - invoice-history.csv  (full event log: sending, delivery, portal views)\n  - expenses.csv + expense-lines.csv + receipts/  (every expense, the lines read off its receipt, and the receipt files Peil keeps)\n  - invoices/<invoice_number>.pdf  (one per non-draft invoice; failures skipped)\n  - settings.json\n\nThe ZIP is always returned even if all PDF generations fail.","operationId":"export_full_api_v1_export_full_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/export/expenses":{"get":{"tags":["export","export"],"summary":"Export Expenses","description":"A ZIP with expenses.csv (every year) and the receipt files Peil keeps.","operationId":"export_expenses_api_v1_export_expenses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/export/bundle":{"post":{"tags":["export","export"],"summary":"Export Bundle","description":"Stream a ZIP containing only the selected data types.\n\nValid ``include`` values: ``clients``, ``time-entries``, ``invoices``,\n``invoice-history``, ``invoice-pdfs``, ``invoice-ubl``, ``expenses`` (CSV +\nreceipt files).  Returns 400 if the\nlist is empty or contains invalid keys.  Individual PDF generation failures\nare skipped with a log warning.","operationId":"export_bundle_api_v1_export_bundle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orientation/snapshot":{"get":{"tags":["orientation","orientation"],"summary":"Get Orientation Snapshot","description":"Compact financial position: what's owed, what's overdue, what's unbilled.","operationId":"get_orientation_snapshot_api_v1_orientation_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/clients/{entity_id}/notes/":{"get":{"tags":["notes","notes"],"summary":"List Notes","operationId":"list_notes_api_v1_clients__entity_id__notes__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteResponse"},"title":"Response List Notes Api V1 Clients  Entity Id  Notes  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["notes","notes"],"summary":"Create Note","operationId":"create_note_api_v1_clients__entity_id__notes__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{entity_id}/notes":{"get":{"tags":["notes","notes"],"summary":"List Notes","operationId":"list_notes_api_v1_clients__entity_id__notes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteResponse"},"title":"Response List Notes Api V1 Clients  Entity Id  Notes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["notes","notes"],"summary":"Create Note","operationId":"create_note_api_v1_clients__entity_id__notes_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{entity_id}/notes/{note_id}/":{"patch":{"tags":["notes","notes"],"summary":"Update Note","operationId":"update_note_api_v1_clients__entity_id__notes__note_id___patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notes","notes"],"summary":"Delete Note","operationId":"delete_note_api_v1_clients__entity_id__notes__note_id___delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clients/{entity_id}/notes/{note_id}":{"patch":{"tags":["notes","notes"],"summary":"Update Note","operationId":"update_note_api_v1_clients__entity_id__notes__note_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notes","notes"],"summary":"Delete Note","operationId":"delete_note_api_v1_clients__entity_id__notes__note_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{entity_id}/notes/":{"get":{"tags":["notes","notes"],"summary":"List Notes","operationId":"list_notes_api_v1_projects__entity_id__notes__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteResponse"},"title":"Response List Notes Api V1 Projects  Entity Id  Notes  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["notes","notes"],"summary":"Create Note","operationId":"create_note_api_v1_projects__entity_id__notes__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{entity_id}/notes":{"get":{"tags":["notes","notes"],"summary":"List Notes","operationId":"list_notes_api_v1_projects__entity_id__notes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteResponse"},"title":"Response List Notes Api V1 Projects  Entity Id  Notes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["notes","notes"],"summary":"Create Note","operationId":"create_note_api_v1_projects__entity_id__notes_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{entity_id}/notes/{note_id}/":{"patch":{"tags":["notes","notes"],"summary":"Update Note","operationId":"update_note_api_v1_projects__entity_id__notes__note_id___patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notes","notes"],"summary":"Delete Note","operationId":"delete_note_api_v1_projects__entity_id__notes__note_id___delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{entity_id}/notes/{note_id}":{"patch":{"tags":["notes","notes"],"summary":"Update Note","operationId":"update_note_api_v1_projects__entity_id__notes__note_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notes","notes"],"summary":"Delete Note","operationId":"delete_note_api_v1_projects__entity_id__notes__note_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_v1_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","operationId":"refresh_token_api_v1_auth_refresh_post","parameters":[{"name":"refresh_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_v1_auth_logout_post","parameters":[{"name":"refresh_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sessions":{"get":{"tags":["auth"],"summary":"List Sessions","operationId":"list_sessions_api_v1_auth_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionOut"},"type":"array","title":"Response List Sessions Api V1 Auth Sessions Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/sessions/{session_id}":{"patch":{"tags":["auth"],"summary":"Rename Session","operationId":"rename_session_api_v1_auth_sessions__session_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Revoke Session","operationId":"revoke_session_api_v1_auth_sessions__session_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/resolve/{slug}":{"get":{"tags":["workspaces"],"summary":"Resolve Workspace Slug","description":"Resolve a workspace slug to confirm it exists.\n\nReturns ``{\"valid\": true, \"slug\": \"...\"}`` when the slug belongs to a user.\nReturns 404 when not found.  Does **not** require authentication — used by\nthe frontend to validate slugs before login and during signup.","operationId":"resolve_workspace_slug_api_v1_workspaces_resolve__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resolve Workspace Slug Api V1 Workspaces Resolve  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/slug":{"patch":{"tags":["workspaces"],"summary":"Set Workspace Slug","description":"Set or change the authenticated user's workspace slug.\n\nBody: ``{\"slug\": \"my-studio\"}``\n\nReturns 409 if the slug is already taken by another user.\nReturns 422 if the slug fails validation.","operationId":"set_workspace_slug_api_v1_workspaces_slug_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Workspace Slug Api V1 Workspaces Slug Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/templates":{"get":{"tags":["templates"],"summary":"List Invoice Templates","operationId":"list_invoice_templates_api_v1_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/config":{"get":{"tags":["billing","billing"],"summary":"Get Billing Config","description":"Public billing config — drives the frontend gating kill-switch.\n\nWhen ``enforced`` is False the UI shows no upgrade gates, matching the\nbackend (which bypasses all gating). No auth required — it leaks nothing.","operationId":"get_billing_config_api_v1_billing_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingConfigResponse"}}}}}}},"/api/v1/billing/status":{"get":{"tags":["billing","billing"],"summary":"Get Billing Status","operationId":"get_billing_status_api_v1_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/checkout":{"post":{"tags":["billing","billing"],"summary":"Create Checkout","operationId":"create_checkout_api_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest","default":{"term":"month"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/cancel":{"post":{"tags":["billing","billing"],"summary":"Cancel Subscription","operationId":"cancel_subscription_api_v1_billing_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/reactivate":{"post":{"tags":["billing","billing"],"summary":"Reactivate Subscription","description":"Resume a cancel-pending subscription.\n\nOn cancel we delete the Mollie subscription but keep access until period end;\nthe SEPA mandate normally stays valid, so we resume by creating a fresh\nsubscription on it (no payment) starting at the paid-through date — never a\ndouble charge. If the mandate has lapsed/been revoked, fall back to a first\npayment to re-authorise (returns a checkout URL for the frontend to redirect).","operationId":"reactivate_subscription_api_v1_billing_reactivate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactivateResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/admin/sync/{user_id}":{"post":{"tags":["billing","billing"],"summary":"Admin Sync Billing","operationId":"admin_sync_billing_api_v1_billing_admin_sync__user_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/payments":{"get":{"tags":["billing","billing"],"summary":"List Payments","description":"List the authenticated user's subscription payments from Mollie.","operationId":"list_payments_api_v1_billing_payments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BillingPaymentItem"},"type":"array","title":"Response List Payments Api V1 Billing Payments Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/receipt/{payment_id}":{"get":{"tags":["billing","billing"],"summary":"Download Receipt","description":"Return a Peil VAT receipt (factuur) PDF for one paid subscription payment.","operationId":"download_receipt_api_v1_billing_receipt__payment_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/jwt/login":{"post":{"tags":["auth"],"summary":"Auth:Jwt.Login","operationId":"auth_jwt_login_api_v1_auth_jwt_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_auth_jwt_login_api_v1_auth_jwt_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BearerResponse"},"example":{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI","token_type":"bearer"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"LOGIN_BAD_CREDENTIALS":{"summary":"Bad credentials or the user is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}},"LOGIN_USER_NOT_VERIFIED":{"summary":"The user is not verified.","value":{"detail":"LOGIN_USER_NOT_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/jwt/logout":{"post":{"tags":["auth"],"summary":"Auth:Jwt.Logout","operationId":"auth_jwt_logout_api_v1_auth_jwt_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/kvk-suggest":{"get":{"tags":["auth"],"summary":"Public Kvk Suggest","operationId":"public_kvk_suggest_api_v1_auth_kvk_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/kvk-detail/{kvk_nummer}":{"get":{"tags":["auth"],"summary":"Public Kvk Detail","operationId":"public_kvk_detail_api_v1_auth_kvk_detail__kvk_nummer__get","parameters":[{"name":"kvk_nummer","in":"path","required":true,"schema":{"type":"string","title":"Kvk Nummer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invite-required":{"get":{"tags":["auth"],"summary":"Invite Required","operationId":"invite_required_api_v1_auth_invite_required_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register:Register","operationId":"register_register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"REGISTER_USER_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"REGISTER_USER_ALREADY_EXISTS"}},"REGISTER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"REGISTER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/request-invite":{"post":{"tags":["auth"],"summary":"Request Invite","description":"Accept an invite request from the register page and forward it to invite@peil.app.\nAlways returns 200 — we never leak whether an address is known or not.","operationId":"request_invite_api_v1_auth_request_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/api-key":{"get":{"tags":["auth"],"summary":"Get Api Keys","description":"Return metadata for all API keys belonging to the current user.","operationId":"get_api_keys_api_v1_auth_api_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyMeta"},"type":"array","title":"Response Get Api Keys Api V1 Auth Api Key Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["auth"],"summary":"Create Api Key","description":"Generate a new named, scoped API key. Up to 10 keys per user.","operationId":"create_api_key_api_v1_auth_api_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/api-key/{key_id}/events":{"get":{"tags":["auth"],"summary":"Get Api Key Events","description":"Audit log for one of the user's API keys, newest first.","operationId":"get_api_key_events_api_v1_auth_api_key__key_id__events_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyEventsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/api-key/{key_id}":{"delete":{"tags":["auth"],"summary":"Revoke Api Key","description":"Revoke a specific API key by id.","operationId":"revoke_api_key_api_v1_auth_api_key__key_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"Paginated fleet list with the abuse-triage signals inline.\n\nBefore this carried signals, the deck listed only the ten most recent\nsignups and triage meant clicking into each account for its country and\nshared-address count — unworkable against a wave. Every signal shown here is\nalso on the per-account detail; this just brings them to the list so the\noperator can see and sort the whole fleet at once.\n\nThe score is computed over the *whole* fleet (so `spam_desc` and the total\nare honest) before the page is sliced. Fine at this scale; revisit with a\nwindowed query if the user table ever runs to five figures.","operationId":"list_users_api_v1_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(created_desc|created_asc|spam_desc)$","default":"created_desc","title":"Sort"}},{"name":"flagged_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Flagged Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/metrics":{"get":{"tags":["admin"],"summary":"Metrics","description":"Server-side product + revenue deck. Complements Plausible (which this\nprivacy-conscious audience under-reports) with the truth from our own DB:\nsignups, plan split, MRR/ARR, the checkout funnel and recent churn.","operationId":"metrics_api_v1_admin_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"User Detail","description":"Per-account operational health, for service operation + support. Derived\nentirely from first-party rows we already hold under contract performance —\n*counts and activity metadata only*. Deliberately excludes the content/figures\nof the user's financial data (no revenue/amounts), in line with the privacy\npolicy: we don't analyse financial content. Not behavioural tracking.","operationId":"user_detail_api_v1_admin_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/revoke-grant":{"post":{"tags":["admin"],"summary":"Revoke Grant","description":"Withdraw a Pro grant (reverse-trial, founder, or admin comp) immediately.\n\nScoped deliberately narrow. This ends *granted* Pro — it does not touch a\npaid subscription, deactivate the account, or delete anything, so the worst\ncase of a wrong call is a user who has to be re-granted.\n\nNote on what a grant does *not* expose: outbound mail is separately gated on\n`is_verified` at every send path (invoices.py — manual send, reminders,\nscheduled send), so an unverified account cannot mail anyone whatever its\nplan says. Revoking is therefore plan hygiene — reclaiming an entitlement\nthat was handed out automatically — not an incident response.\n\n`is_founder` is left set on purpose. It is a durable historical marker of\nwho registered in the launch window, not an entitlement — it gates *price*\neligibility, which only matters if they ever pay. Clearing it would rewrite\nthe record of what happened; expiring the grant is what changes access.","operationId":"revoke_grant_api_v1_admin_users__user_id__revoke_grant_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/grant":{"post":{"tags":["admin"],"summary":"Grant Pro","description":"Confer Pro on an account — a positive, deliberate operator action.\n\nTwo kinds, both reusing the existing grant machinery rather than adding a new\nentitlement path:\n  - `pro`   → an indefinite free comp. pro_source='admin', no expiry; never\n              touched by the trial/founder nudge cron, and revocable from the\n              deck (REVOCABLE_SOURCES).\n  - `trial` → a time-boxed Pro window (default 30 days, 1–90). pro_source='trial'\n              + pro_expires_at, so the whole reverse-trial lifecycle applies for\n              free: the countdown banner, the T-3 heads-up and the T-0 lapse +\n              'ended' email all fire with no extra code — the retention hook.\n\nRefuses only on a live paid subscription: that account already has Pro through\nMollie, and layering a comp on top creates a confusing dual state the next\nreconcile would fight. Handle billing (cancel) instead. `is_founder` is never\nset — that marker means 'registered in the launch window', which a comp is not.","operationId":"grant_pro_api_v1_admin_users__user_id__grant_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/email-health":{"get":{"tags":["admin"],"summary":"Email Health","description":"Deliverability of the shared sending domain.\n\nEvery user's mail leaves as noreply@mail.peil.app, so reputation is a single\nshared asset: one account's complaints degrade delivery for everyone. Per-user\nemail history cannot show that — the damage is only visible in aggregate,\nwhich is why this is an operator view and not a user-facing one.\n\nDeliberately built on the *negative* signals only. Opens and clicks are not\ndeliverability metrics and are actively misleading here: corporate mail\ngateways fetch every link on delivery, so a single scanned message can log\nseveral clicks and an open with no human involved (observed July 2026 —\nfour clicks in the delivery minute, before the first open). Bounces and\ncomplaints have no such automated analogue.","operationId":"email_health_api_v1_admin_email_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/users/{user_id}/shared-cohort":{"get":{"tags":["admin"],"summary":"Shared Cohort","description":"Every account that registered from this account's signup address.\n\nA preview, deliberately separate from the action. A shared address is *not*\nproof of abuse — carrier CGNAT, coworking wifi and corporate NAT all put\nunrelated people behind one IP, and at any real scale that will happen to\nhonest users. So the cohort is shown in full, with the activity counts that\nactually distinguish a bot farm (nothing created, ever) from colleagues who\nshare an office, and nothing changes until it is confirmed against this list.\n\nThe address itself is never returned — it is resolved server-side, keeping\nthe country-only stance the deck already takes on location data.","operationId":"shared_cohort_api_v1_admin_users__user_id__shared_cohort_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/revoke-grant-cohort":{"post":{"tags":["admin"],"summary":"Revoke Grant Cohort","description":"Withdraw the time-boxed grant from every account on this signup address.\n\nExists because doing it one dialog at a time is how one gets missed — of the\nsix July 2026 bot accounts revoked by hand, five took and the sixth was\noverlooked, which is the failure mode a bulk action removes.\n\nReports every account it touched *and* every one it skipped with a reason.\nA bulk action that silently declines part of its work is worse than no bulk\naction: the operator believes the cohort is handled when it is not.","operationId":"revoke_grant_cohort_api_v1_admin_users__user_id__revoke_grant_cohort_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/bulk":{"post":{"tags":["admin"],"summary":"Bulk User Action","description":"Apply one action to an explicit set of accounts, reporting every skip.\n\nSync session on purpose: `delete` reuses `purge_user` (ordered child-first\ndeletes + the Mollie-cancel backstop), which is sync — reimplementing it in\nasync would be a second, drifting copy of fragile FK-ordering logic. The\nother three actions are trivial column writes.\n\nGuardrails, all surfaced rather than silent:\n  - the acting admin and any other admin are never touched (`is_admin`);\n  - `revoke_grant` only ends a grant (`REVOCABLE_SOURCES`);\n  - `ban`/`delete` refuse on a live paid subscription (`_is_paying`).\n\n`ban` sets is_active=False (fastapi-users blocks login on it and the deck\ndrops the account from every count); `delete` is irreversible.","operationId":"bulk_user_action_api_v1_admin_users_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUserAction"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/audit-log":{"get":{"tags":["admin"],"summary":"Audit Log","description":"The destructive-action trail, newest first.\n\nReads back what the ban/delete/revoke handlers write to `admin_actions`. The\nsubject may be a purged account (a `delete` removes the user row while this\nrow survives — the point of the table), so the target email is resolved\nbest-effort and comes back null when the account is gone; the id is always\nkept so the action is never anonymous.","operationId":"audit_log_api_v1_admin_audit_log_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/signup-blocks":{"get":{"tags":["admin"],"summary":"Signup Blocks Log","description":"The fly-buzzer's rejected-registration trail, newest first.\n\nBacks the deck's \"Bots geweerd\" stat once it's clickable: the metric only counts,\nthis lists the honeypot / submit-timing (and, once live, Turnstile) bounces behind\nit. No user was created — there is no FK, each row is an attempt that never became\nan account — so the operator can read an absence of spam signups honestly: is the\ngate catching bots, or are none arriving?","operationId":"signup_blocks_log_api_v1_admin_signup_blocks_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/retention":{"get":{"tags":["admin"],"summary":"Retention","description":"The win-back surface: lapsed low-use trials queued for (or past) the\n'haven't had time to meet' nudge, plus the running total already sent.\n\nSync session so it shares `winback_candidates` verbatim with the cron that\nsends — the surface and the sender can never diverge. Founders are absent by\nconstruction (trial_lapsed_at is only stamped for trials).","operationId":"retention_api_v1_admin_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/templates":{"get":{"tags":["admin"],"summary":"List All Templates","operationId":"list_all_templates_api_v1_admin_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Template","operationId":"create_template_api_v1_admin_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/templates/{template_id}":{"get":{"tags":["admin"],"summary":"Get Template","operationId":"get_template_api_v1_admin_templates__template_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Template","operationId":"update_template_api_v1_admin_templates__template_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/templates/{template_id}/publish":{"post":{"tags":["admin"],"summary":"Publish Template","operationId":"publish_template_api_v1_admin_templates__template_id__publish_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/templates/{template_id}/unpublish":{"post":{"tags":["admin"],"summary":"Unpublish Template","operationId":"unpublish_template_api_v1_admin_templates__template_id__unpublish_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/templates/{template_id}/ai-edit":{"post":{"tags":["admin"],"summary":"Ai Edit Template Endpoint","description":"Propose an AI edit of the template using the caller's own Anthropic key\n(BYO — calls bill their account). Returns the proposal; nothing is saved —\nthe human reviews the diff in the editor and saves explicitly.","operationId":"ai_edit_template_endpoint_api_v1_admin_templates__template_id__ai_edit_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/templates/preview":{"post":{"tags":["admin"],"summary":"Preview Template Source","description":"Compile the posted (unsaved) source with sample data → SVG.","operationId":"preview_template_source_api_v1_admin_templates_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatePreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/surfaces/{surface}":{"get":{"tags":["admin"],"summary":"Get Surface","operationId":"get_surface_api_v1_admin_surfaces__surface__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}},{"name":"owner_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Put Surface","operationId":"put_surface_api_v1_admin_surfaces__surface__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Surface","description":"Remove the custom surface — the owner falls back to the default layout.","operationId":"delete_surface_api_v1_admin_surfaces__surface__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}},{"name":"owner_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/surfaces/{surface}/preview":{"post":{"tags":["admin"],"summary":"Preview Surface","description":"Render posted (unsaved) HTML with sample variables — for the editor.","operationId":"preview_surface_api_v1_admin_surfaces__surface__preview_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfacePreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["users"],"summary":"Users:Current User","operationId":"users_current_user_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["users"],"summary":"Users:Patch Current User","operationId":"users_patch_current_user_api_v1_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/users/{id}":{"get":{"tags":["users"],"summary":"Users:User","operationId":"users_user_api_v1_users__id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["users"],"summary":"Users:Patch User","operationId":"users_patch_user_api_v1_users__id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"400":{"content":{"application/json":{"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}},"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["users"],"summary":"Users:Delete User","operationId":"users_delete_user_api_v1_users__id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Reset:Forgot Password","operationId":"reset_forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_forgot_password_api_v1_auth_forgot_password_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset:Reset Password","operationId":"reset_reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_reset_password_api_v1_auth_reset_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"RESET_PASSWORD_BAD_TOKEN":{"summary":"Bad or expired token.","value":{"detail":"RESET_PASSWORD_BAD_TOKEN"}},"RESET_PASSWORD_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"RESET_PASSWORD_INVALID_PASSWORD","reason":"Password should be at least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/request-verify-token":{"post":{"tags":["auth"],"summary":"Verify:Request-Token","operationId":"verify_request_token_api_v1_auth_request_verify_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_request_token_api_v1_auth_request_verify_token_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify":{"post":{"tags":["auth"],"summary":"Verify:Verify","operationId":"verify_verify_api_v1_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_verify_api_v1_auth_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"VERIFY_USER_BAD_TOKEN":{"summary":"Bad token, not existing user ornot the e-mail currently set for the user.","value":{"detail":"VERIFY_USER_BAD_TOKEN"}},"VERIFY_USER_ALREADY_VERIFIED":{"summary":"The user is already verified.","value":{"detail":"VERIFY_USER_ALREADY_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google/authorize":{"get":{"tags":["auth"],"summary":"Oauth:Google.Jwt.Authorize","operationId":"oauth_google_jwt_authorize_api_v1_auth_google_authorize_get","parameters":[{"name":"scopes","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Scopes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuth2AuthorizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google/callback":{"get":{"tags":["auth"],"summary":"Oauth:Google.Jwt.Callback","description":"The response varies based on the authentication backend used.","operationId":"oauth_google_jwt_callback_api_v1_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"code_verifier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"content":{"application/json":{"examples":{"INVALID_STATE_TOKEN":{"summary":"Invalid state token."},"LOGIN_BAD_CREDENTIALS":{"summary":"User is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}}},"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AOVSettings":{"properties":{"schedule":{"additionalProperties":{"type":"number"},"type":"object","title":"Schedule","default":{"2025":123.64,"2026":157.64,"2027":160.79,"2028":164.0,"2029":167.29,"2030":170.63,"2031":174.04,"2032":177.52,"2033":181.07,"2034":184.7,"2035":188.39,"2036":192.15,"2037":196.0,"2038":199.91,"2039":203.91,"2040":208.0,"2041":212.15,"2042":216.4,"2043":220.73,"2044":225.14,"2045":229.64,"2046":234.24,"2047":238.92,"2048":243.7,"2049":248.57,"2050":253.55,"2051":258.61,"2052":263.79,"2053":269.06,"2054":274.45,"2055":279.94,"2056":285.54,"2057":291.24}},"start_year":{"type":"integer","title":"Start Year","default":2025}},"type":"object","title":"AOVSettings","description":"Dutch AOV (freelance insurance) settings - Progressive yearly rates"},"Activity":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable":{"type":"boolean","title":"Billable","default":true},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["name"],"title":"Activity"},"ActivityCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable":{"type":"boolean","title":"Billable","default":true}},"type":"object","required":["name"],"title":"ActivityCreate"},"ActivityUpdate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable":{"type":"boolean","title":"Billable","default":true}},"type":"object","required":["name"],"title":"ActivityUpdate"},"AiEditRequest":{"properties":{"instruction":{"type":"string","title":"Instruction"}},"type":"object","required":["instruction"],"title":"AiEditRequest"},"AnalyzeResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"delimiter":{"type":"string","title":"Delimiter"},"row_count":{"type":"integer","title":"Row Count"},"column_mappings":{"items":{"$ref":"#/components/schemas/ColumnMapping"},"type":"array","title":"Column Mappings"},"sample_rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Sample Rows"},"warnings":{"items":{"$ref":"#/components/schemas/ImportWarning"},"type":"array","title":"Warnings"},"detected_date_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Date Format"},"detected_number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Number Format"}},"type":"object","required":["entity_type","delimiter","row_count","column_mappings","sample_rows","warnings"],"title":"AnalyzeResponse"},"ApiKeyCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":"Default"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","default":["read"]},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"}},"type":"object","title":"ApiKeyCreateRequest"},"ApiKeyCreated":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","key","name","prefix","scopes","expires_at","created_at"],"title":"ApiKeyCreated"},"ApiKeyEventOut":{"properties":{"id":{"type":"integer","title":"Id"},"event_type":{"type":"string","title":"Event Type"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"event_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Data"}},"type":"object","required":["id","event_type","created_at","event_data"],"title":"ApiKeyEventOut"},"ApiKeyEventsPage":{"properties":{"total":{"type":"integer","title":"Total"},"events":{"items":{"$ref":"#/components/schemas/ApiKeyEventOut"},"type":"array","title":"Events"}},"type":"object","required":["total","events"],"title":"ApiKeyEventsPage"},"ApiKeyMeta":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","name","prefix","scopes","expires_at","created_at","last_used_at"],"title":"ApiKeyMeta"},"BearerResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"}},"type":"object","required":["access_token","token_type"],"title":"BearerResponse"},"BillingConfigResponse":{"properties":{"enforced":{"type":"boolean","title":"Enforced"},"configured":{"type":"boolean","title":"Configured"},"price":{"type":"string","title":"Price"},"currency":{"type":"string","title":"Currency"},"terms":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Terms"}},"type":"object","required":["enforced","configured","price","currency"],"title":"BillingConfigResponse"},"BillingPaymentItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"BillingPaymentItem"},"BillingStatusResponse":{"properties":{"plan":{"type":"string","title":"Plan"},"status":{"type":"string","title":"Status"},"billing_configured":{"type":"boolean","title":"Billing Configured"},"pro_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pro Source"},"is_founder":{"type":"boolean","title":"Is Founder","default":false},"grant":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Grant"},"trial":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trial"},"eligible_terms":{"items":{"type":"string"},"type":"array","title":"Eligible Terms"},"provider_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Status"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"mollie_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mollie Customer Id"},"mollie_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mollie Subscription Id"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"cancelled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelled At"},"last_failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure Reason"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"billing_interval":{"type":"string","title":"Billing Interval","default":"month"},"billing_visible":{"type":"boolean","title":"Billing Visible","default":true},"needs_reconciliation":{"type":"boolean","title":"Needs Reconciliation"}},"type":"object","required":["plan","status","billing_configured","provider_status","payment_status","mollie_customer_id","mollie_subscription_id","current_period_end","cancel_at_period_end","cancelled_at","last_failure_reason","needs_reconciliation"],"title":"BillingStatusResponse"},"Body_analyze_csv_api_v1_import_analyze__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_analyze_csv_api_v1_import_analyze__post"},"Body_analyze_csv_api_v1_import_analyze_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_analyze_csv_api_v1_import_analyze_post"},"Body_auth_jwt_login_api_v1_auth_jwt_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_auth_jwt_login_api_v1_auth_jwt_login_post"},"Body_execute_import_api_v1_import_execute__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"config":{"type":"string","title":"Config"}},"type":"object","required":["file","config"],"title":"Body_execute_import_api_v1_import_execute__post"},"Body_execute_import_api_v1_import_execute_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"config":{"type":"string","title":"Config"}},"type":"object","required":["file","config"],"title":"Body_execute_import_api_v1_import_execute_post"},"Body_execute_ubl_import_api_v1_import_ubl_execute__post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"mark_as":{"type":"string","title":"Mark As","default":"paid"}},"type":"object","required":["files"],"title":"Body_execute_ubl_import_api_v1_import_ubl_execute__post"},"Body_execute_ubl_import_api_v1_import_ubl_execute_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"mark_as":{"type":"string","title":"Mark As","default":"paid"}},"type":"object","required":["files"],"title":"Body_execute_ubl_import_api_v1_import_ubl_execute_post"},"Body_login_api_v1_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_v1_auth_login_post"},"Body_mollie_invoice_webhook_api_v1_webhooks_mollie_invoice_post":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"Body_mollie_invoice_webhook_api_v1_webhooks_mollie_invoice_post"},"Body_mollie_webhook_api_v1_webhooks_mollie_post":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"Body_mollie_webhook_api_v1_webhooks_mollie_post"},"Body_preview_import_api_v1_import_preview__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"config":{"type":"string","title":"Config"}},"type":"object","required":["file","config"],"title":"Body_preview_import_api_v1_import_preview__post"},"Body_preview_import_api_v1_import_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"config":{"type":"string","title":"Config"}},"type":"object","required":["file","config"],"title":"Body_preview_import_api_v1_import_preview_post"},"Body_preview_ubl_import_api_v1_import_ubl_preview__post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_preview_ubl_import_api_v1_import_ubl_preview__post"},"Body_preview_ubl_import_api_v1_import_ubl_preview_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_preview_ubl_import_api_v1_import_ubl_preview_post"},"Body_read_receipt_api_v1_expenses_read_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"careful":{"type":"boolean","title":"Careful","default":false}},"type":"object","required":["files"],"title":"Body_read_receipt_api_v1_expenses_read_post"},"Body_reset_forgot_password_api_v1_auth_forgot_password_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_reset_forgot_password_api_v1_auth_forgot_password_post"},"Body_reset_reset_password_api_v1_auth_reset_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_reset_reset_password_api_v1_auth_reset_password_post"},"Body_upload_invoice_logo_api_v1_settings_invoice_logo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_invoice_logo_api_v1_settings_invoice_logo_post"},"Body_upload_receipt_api_v1_expenses__expense_id__receipts_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_receipt_api_v1_expenses__expense_id__receipts_post"},"Body_upload_receipt_api_v1_recurring_costs__id__receipts_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_receipt_api_v1_recurring_costs__id__receipts_post"},"Body_verify_request_token_api_v1_auth_request_verify_token_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_verify_request_token_api_v1_auth_request_verify_token_post"},"Body_verify_verify_api_v1_auth_verify_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_verify_verify_api_v1_auth_verify_post"},"BootstrapPreviewRequest":{"properties":{"hourly_rate":{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0,"title":"Hourly Rate"},"annual_hours":{"type":"number","maximum":8760.0,"exclusiveMinimum":0.0,"title":"Annual Hours"},"liquid_savings":{"type":"number","maximum":100000000.0,"minimum":0.0,"title":"Liquid Savings"},"monthly_living_costs":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Monthly Living Costs"},"business_costs_monthly":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Business Costs Monthly","default":0.0},"aov_monthly":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Aov Monthly","default":0.0},"pension_monthly":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Pension Monthly","default":0.0},"buffer_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Buffer Pct","default":15.0},"non_billable_hours":{"type":"number","maximum":8760.0,"minimum":0.0,"title":"Non Billable Hours","default":0.0}},"type":"object","required":["hourly_rate","annual_hours","liquid_savings","monthly_living_costs"],"title":"BootstrapPreviewRequest"},"BootstrapRequest":{"properties":{"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"annual_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Hours"},"liquid_savings":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquid Savings"},"monthly_living_costs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Living Costs"},"business_costs_monthly":{"type":"number","title":"Business Costs Monthly","default":0.0},"aov_monthly":{"type":"number","title":"Aov Monthly","default":0.0},"pension_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pension Monthly"},"buffer_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buffer Pct"},"non_billable_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Non Billable Hours"}},"type":"object","title":"BootstrapRequest"},"BulkUserAction":{"properties":{"user_ids":{"items":{"type":"integer"},"type":"array","title":"User Ids"},"action":{"type":"string","title":"Action"}},"type":"object","required":["user_ids","action"],"title":"BulkUserAction"},"BundleRequest":{"properties":{"include":{"items":{"type":"string"},"type":"array","title":"Include"}},"type":"object","required":["include"],"title":"BundleRequest"},"CheckoutRequest":{"properties":{"term":{"type":"string","title":"Term","default":"month"}},"type":"object","title":"CheckoutRequest"},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"}},"type":"object","required":["checkout_url"],"title":"CheckoutResponse"},"Client":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"contact_person":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Contact Person"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address"},"street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Street"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country","default":"NL"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"kvk_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Kvk Number"},"color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Color"},"default_rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Default Rate"},"payment_terms_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Payment Terms Days","default":30},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"lang":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Lang","default":"nl"},"active":{"type":"boolean","title":"Active","default":true},"id":{"type":"integer","title":"Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"email_suppressed":{"type":"boolean","title":"Email Suppressed","default":false},"email_suppressed_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Suppressed Reason"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"Client"},"ClientCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"contact_person":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Contact Person"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address"},"street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Street"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country","default":"NL"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"kvk_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Kvk Number"},"color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Color"},"default_rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Default Rate"},"payment_terms_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Payment Terms Days","default":30},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"lang":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Lang","default":"nl"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name"],"title":"ClientCreate"},"ClientUpdate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"contact_person":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Contact Person"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address"},"street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Street"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country","default":"NL"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"kvk_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Kvk Number"},"color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Color"},"default_rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Default Rate"},"payment_terms_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Payment Terms Days","default":30},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"lang":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Lang","default":"nl"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name"],"title":"ClientUpdate"},"ColumnMapping":{"properties":{"csv_column":{"type":"string","title":"Csv Column"},"peil_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peil Field"},"confidence":{"type":"number","title":"Confidence","default":0.0},"sample_values":{"items":{"type":"string"},"type":"array","title":"Sample Values","default":[]}},"type":"object","required":["csv_column"],"title":"ColumnMapping"},"ComprehensiveSettings":{"properties":{"financial":{"$ref":"#/components/schemas/FinancialSettings","default":{"buffer_percentage":15.0,"monthly_personal_investment":0.0,"monthly_living_costs":0.0,"liquid_savings":0.0,"annual_hour_growth_rate":2.0,"annual_rate_increase":3.0,"rolling_average_months":6,"tax_calculation_method":"progressive","include_aov_in_calculations":true,"home_office_deduction_percentage":20.0,"business_auto_percentage":0.0,"target_savings_rate":20.0,"retirement_contribution_rate":10.0,"emergency_fund_months":6,"average_payment_delay_days":30,"bad_debt_percentage":2.0,"market_rate_adjustment":0.0,"skill_premium_growth":1.0,"cost_inflation_rate":3.0,"healthcare_cost_growth":5.0}},"locale":{"$ref":"#/components/schemas/LocaleSettings","default":{"currency":"EUR","number_format":"nl_NL","time_format":"24h","date_format":"dd-mm-yyyy","default_workday_hours":7.0,"default_start_time":"10:00","default_end_time":"17:00"}},"aov":{"$ref":"#/components/schemas/AOVSettings","default":{"schedule":{"2025":123.64,"2026":157.64,"2027":160.79,"2028":164.0,"2029":167.29,"2030":170.63,"2031":174.04,"2032":177.52,"2033":181.07,"2034":184.7,"2035":188.39,"2036":192.15,"2037":196.0,"2038":199.91,"2039":203.91,"2040":208.0,"2041":212.15,"2042":216.4,"2043":220.73,"2044":225.14,"2045":229.64,"2046":234.24,"2047":238.92,"2048":243.7,"2049":248.57,"2050":253.55,"2051":258.61,"2052":263.79,"2053":269.06,"2054":274.45,"2055":279.94,"2056":285.54,"2057":291.24},"start_year":2025}},"widgets":{"$ref":"#/components/schemas/WidgetSettings","default":{"enabled_widgets":["current_month","invoice_draft","invoice_sent","invoice_overdue","invoice_paid","blended_rate","effective_rate","tax_overview","future_projection","quarterly_performance","gross_revenue_projection","dutch_tax_deductions","quarterly_vat_obligations","tax_savings_recommendations"],"widget_order":{},"widget_layout":{},"hidden_widgets":[],"widget_categories_enabled":{"analytics":true,"financial":true,"invoicing":true,"projections":true,"time_tracking":true}}},"deduction_overrides":{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object","title":"Deduction Overrides","default":{}},"active_projection_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Active Projection Rate"},"kor_active":{"type":"boolean","title":"Kor Active","default":false},"startersaftrek_override":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Startersaftrek Override"},"attach_ubl_to_email":{"type":"boolean","title":"Attach Ubl To Email","default":false}},"type":"object","title":"ComprehensiveSettings","description":"Complete user settings matching legacy functionality"},"ErrorModel":{"properties":{"detail":{"anyOf":[{"type":"string"},{"additionalProperties":{"type":"string"},"type":"object"}],"title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel"},"Expense":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"name":{"type":"string","title":"Name"},"date":{"type":"string","format":"date","title":"Date"},"category":{"type":"string","title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"total_amount":{"type":"string","title":"Total Amount"},"vat_amount":{"type":"string","title":"Vat Amount"},"amount":{"type":"string","title":"Amount"},"tax_deductible":{"type":"boolean","title":"Tax Deductible"},"depreciation_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depreciation Years"},"deductible_pct":{"type":"integer","title":"Deductible Pct"},"deductible_amount":{"type":"string","title":"Deductible Amount"},"receipts":{"items":{"$ref":"#/components/schemas/Receipt"},"type":"array","title":"Receipts","default":[]},"lines":{"items":{"$ref":"#/components/schemas/ExpenseLine-Output"},"type":"array","title":"Lines","default":[]},"private_split":{"type":"boolean","title":"Private Split","default":false},"supplier":{"anyOf":[{"$ref":"#/components/schemas/ExpenseSupplier"},{"type":"null"}]},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"contact":{"anyOf":[{"$ref":"#/components/schemas/ExpenseContact"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","user_id","name","date","category","total_amount","vat_amount","amount","tax_deductible","deductible_pct","deductible_amount"],"title":"Expense"},"ExpenseContact":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"ExpenseContact"},"ExpenseCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"date":{"type":"string","format":"date","title":"Date"},"category":{"type":"string","maxLength":40,"minLength":1,"title":"Category"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"total_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"}],"title":"Total Amount"},"vat_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Vat Amount"},"tax_deductible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tax Deductible"},"depreciation_years":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Depreciation Years"},"lines":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExpenseLine-Input"},"type":"array","maxItems":300},{"type":"null"}],"title":"Lines"},"private_split":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Private Split"},"supplier":{"anyOf":[{"$ref":"#/components/schemas/ExpenseSupplier"},{"type":"null"}]},"document_number":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Document Number"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"reading_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reading Id"}},"type":"object","required":["name","date","category","total_amount"],"title":"ExpenseCreate"},"ExpenseLine-Input":{"properties":{"description":{"type":"string","maxLength":500,"minLength":1,"title":"Description"},"quantity":{"anyOf":[{"type":"number","exclusiveMaximum":1000000.0,"exclusiveMinimum":-1000000.0},{"type":"string"},{"type":"null"}],"title":"Quantity"},"amount":{"anyOf":[{"type":"number","exclusiveMaximum":100000000.0,"exclusiveMinimum":-100000000.0},{"type":"string"},{"type":"null"}],"title":"Amount"},"vat_rate":{"anyOf":[{"type":"string","enum":["21","9","0"]},{"type":"null"}],"title":"Vat Rate"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["description"],"title":"ExpenseLine","description":"A line of the receipt, as read. Shaped like an invoice line."},"ExpenseLine-Output":{"properties":{"description":{"type":"string","maxLength":500,"minLength":1,"title":"Description"},"quantity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quantity"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"vat_rate":{"anyOf":[{"type":"string","enum":["21","9","0"]},{"type":"null"}],"title":"Vat Rate"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["description"],"title":"ExpenseLine","description":"A line of the receipt, as read. Shaped like an invoice line."},"ExpenseSummary":{"properties":{"year":{"type":"integer","title":"Year"},"total_amount":{"type":"string","title":"Total Amount"},"total_deductible":{"type":"string","title":"Total Deductible"},"written_off":{"type":"string","title":"Written Off","default":"0"},"investments":{"type":"string","title":"Investments","default":"0"},"count":{"type":"integer","title":"Count"},"by_category":{"additionalProperties":{"type":"number"},"type":"object","title":"By Category","default":{}}},"type":"object","required":["year","total_amount","total_deductible","count"],"title":"ExpenseSummary"},"ExpenseSupplier":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country"},"kvk":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kvk"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Street"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"contact_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Contact Name"}},"type":"object","title":"ExpenseSupplier","description":"Who issued the receipt, as read (or typed)."},"ExpenseUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"category":{"anyOf":[{"type":"string","maxLength":40,"minLength":1},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"total_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Total Amount"},"vat_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Vat Amount"},"tax_deductible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tax Deductible"},"depreciation_years":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Depreciation Years"},"lines":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExpenseLine-Input"},"type":"array","maxItems":300},{"type":"null"}],"title":"Lines"},"private_split":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Private Split"},"supplier":{"anyOf":[{"$ref":"#/components/schemas/ExpenseSupplier"},{"type":"null"}]},"document_number":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Document Number"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},"type":"object","title":"ExpenseUpdate"},"FinancialLabOverrides":{"properties":{"projected_revenue":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Revenue"},"projected_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Hours"},"non_billable_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Non Billable Hours"},"retainer_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retainer Hours"},"fixed_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fixed Hours"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"deductible_costs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deductible Costs"},"aov_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Aov Monthly"},"pension_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pension Monthly"},"buffer_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buffer Percentage"},"liquid_reserves":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquid Reserves"},"illiquid_reserves":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Illiquid Reserves"},"monthly_personal_spend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Personal Spend"},"monthly_living_costs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Living Costs"},"emp_pension_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Emp Pension Enabled","default":true},"emp_pension_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Emp Pension Pct","default":10.0},"emp_pension_split_employer":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Emp Pension Split Employer","default":0.5},"salary_offer":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Salary Offer"},"tax_reserve_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tax Reserve Monthly"},"prior_year_tax":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prior Year Tax"},"tax_payment_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Payment Month"}},"type":"object","title":"FinancialLabOverrides"},"FinancialSettings":{"properties":{"buffer_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Buffer Percentage","default":15.0},"monthly_personal_investment":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Monthly Personal Investment","default":0.0},"monthly_living_costs":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Monthly Living Costs","default":0.0},"liquid_savings":{"type":"number","maximum":100000000.0,"minimum":0.0,"title":"Liquid Savings","default":0.0},"annual_hour_growth_rate":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Annual Hour Growth Rate","default":2.0},"annual_rate_increase":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Annual Rate Increase","default":3.0},"rolling_average_months":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Rolling Average Months","default":6},"tax_calculation_method":{"type":"string","title":"Tax Calculation Method","default":"progressive"},"include_aov_in_calculations":{"type":"boolean","title":"Include Aov In Calculations","default":true},"home_office_deduction_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Home Office Deduction Percentage","default":20.0},"business_auto_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Business Auto Percentage","default":0.0},"target_savings_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Target Savings Rate","default":20.0},"retirement_contribution_rate":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Retirement Contribution Rate","default":10.0},"emergency_fund_months":{"type":"integer","maximum":120.0,"minimum":0.0,"title":"Emergency Fund Months","default":6},"average_payment_delay_days":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Average Payment Delay Days","default":30},"bad_debt_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Bad Debt Percentage","default":2.0},"market_rate_adjustment":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Market Rate Adjustment","default":0.0},"skill_premium_growth":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Skill Premium Growth","default":1.0},"cost_inflation_rate":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Cost Inflation Rate","default":3.0},"healthcare_cost_growth":{"type":"number","maximum":100.0,"minimum":-50.0,"title":"Healthcare Cost Growth","default":5.0}},"type":"object","title":"FinancialSettings","description":"Financial planning and calculation settings"},"GrantRequest":{"properties":{"kind":{"type":"string","title":"Kind"},"days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},"type":"object","required":["kind"],"title":"GrantRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportEventOut":{"properties":{"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"detected_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Type"},"total_rows":{"type":"integer","title":"Total Rows"},"imported_count":{"type":"integer","title":"Imported Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"error_count":{"type":"integer","title":"Error Count"}},"type":"object","required":["id","created_at","filename","detected_type","total_rows","imported_count","skipped_count","error_count"],"title":"ImportEventOut"},"ImportPreviewResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"total_rows":{"type":"integer","title":"Total Rows"},"ok_count":{"type":"integer","title":"Ok Count"},"skip_count":{"type":"integer","title":"Skip Count"},"error_count":{"type":"integer","title":"Error Count"},"rows":{"items":{"$ref":"#/components/schemas/PreviewRow"},"type":"array","title":"Rows"},"new_clients":{"items":{"type":"string"},"type":"array","title":"New Clients","default":[]}},"type":"object","required":["entity_type","total_rows","ok_count","skip_count","error_count","rows"],"title":"ImportPreviewResponse"},"ImportReport":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"total_rows":{"type":"integer","title":"Total Rows"},"created":{"type":"integer","title":"Created"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"$ref":"#/components/schemas/ImportRowError"},"type":"array","title":"Errors"},"skipped_rows":{"items":{"$ref":"#/components/schemas/ImportRowSkipped"},"type":"array","title":"Skipped Rows","default":[]},"auto_created_clients":{"items":{"type":"string"},"type":"array","title":"Auto Created Clients"},"created_entries":{"items":{"$ref":"#/components/schemas/ImportedEntry"},"type":"array","title":"Created Entries","default":[]},"created_record_ids":{"additionalProperties":true,"type":"object","title":"Created Record Ids","default":{}},"duration_ms":{"type":"integer","title":"Duration Ms"}},"type":"object","required":["entity_type","total_rows","created","skipped","errors","auto_created_clients","duration_ms"],"title":"ImportReport"},"ImportRowError":{"properties":{"row_number":{"type":"integer","title":"Row Number"},"error":{"type":"string","title":"Error"},"row_data":{"additionalProperties":true,"type":"object","title":"Row Data"}},"type":"object","required":["row_number","error","row_data"],"title":"ImportRowError"},"ImportRowSkipped":{"properties":{"row_number":{"type":"integer","title":"Row Number"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["row_number","reason"],"title":"ImportRowSkipped"},"ImportWarning":{"properties":{"type":{"type":"string","title":"Type"},"message":{"type":"string","title":"Message"},"column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column"},"severity":{"type":"string","title":"Severity","default":"warning"}},"type":"object","required":["type","message"],"title":"ImportWarning"},"ImportedEntry":{"properties":{"row_number":{"type":"integer","title":"Row Number"},"fields":{"additionalProperties":true,"type":"object","title":"Fields"}},"type":"object","required":["row_number","fields"],"title":"ImportedEntry","description":"Lightweight summary of a created entry for the results table."},"InviteRequestBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"InviteRequestBody"},"Invoice":{"properties":{"invoice_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Invoice Number"},"client_id":{"type":"integer","title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"subtotal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Subtotal"},"vat_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Vat Rate"},"vat_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vat Amount"},"total_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Amount"},"total_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Total Hours"},"reverse_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reverse Charge"},"status":{"type":"string","maxLength":50,"title":"Status","default":"draft"},"payment_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Payment Date"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"pdf_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Pdf Path"},"recurring":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recurring"},"recurrence_interval":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Recurrence Interval"},"recurrence_anchor_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Anchor Day"},"recurrence_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Project Id"},"parent_invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Invoice Id"},"email_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Sent At"},"resend_email_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Resend Email Id"},"email_delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Delivered At"},"email_opened_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Opened At"},"email_bounced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Bounced At"},"email_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Failed At"},"payment_reference":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Payment Reference"},"last_reminder_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reminder At"},"reminder_count":{"type":"integer","title":"Reminder Count","default":0},"scheduled_send_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Send At"},"template_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Fields"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"lines":{"items":{"$ref":"#/components/schemas/InvoiceLineRead"},"type":"array","title":"Lines","default":[]},"time_entry_ids":{"items":{"type":"integer"},"type":"array","title":"Time Entry Ids","default":[]}},"type":"object","required":["client_id","id","created_at","updated_at"],"title":"Invoice"},"InvoiceCreate":{"properties":{"invoice_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Invoice Number"},"client_id":{"type":"integer","title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"subtotal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Subtotal"},"vat_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Vat Rate"},"total_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Total Hours"},"reverse_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reverse Charge"},"status":{"type":"string","enum":["draft","sent","paid","overdue","archived"],"title":"Status","default":"draft"},"payment_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Payment Date"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"pdf_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Pdf Path"},"payment_reference":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Payment Reference"},"template_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Fields"},"source":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Source"},"lines":{"items":{"$ref":"#/components/schemas/InvoiceLineCreate"},"type":"array","maxItems":200,"title":"Lines","default":[]},"time_entry_ids":{"items":{"type":"integer"},"type":"array","maxItems":1000,"title":"Time Entry Ids","default":[]},"recurring":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recurring"},"recurrence_interval":{"anyOf":[{"type":"string","enum":["monthly","quarterly","annual"]},{"type":"null"}],"title":"Recurrence Interval"},"recurrence_anchor_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Anchor Day"},"recurrence_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Project Id"},"parent_invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Invoice Id"}},"type":"object","required":["client_id","period_start","period_end"],"title":"InvoiceCreate"},"InvoiceFromHoursRequest":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"grouping":{"type":"string","enum":["summary","by_project","per_day"],"title":"Grouping","default":"summary"},"entry_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":1000},{"type":"null"}],"title":"Entry Ids"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"reverse_charge":{"type":"boolean","title":"Reverse Charge","default":false}},"type":"object","required":["client_id","period_start","period_end"],"title":"InvoiceFromHoursRequest","description":"Composed intent verb: draft an invoice from unbilled hours (Builder API)."},"InvoiceFromHoursResponse":{"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"},"entry_count":{"type":"integer","title":"Entry Count"},"total_hours":{"type":"number","title":"Total Hours"}},"type":"object","required":["invoice","entry_count","total_hours"],"title":"InvoiceFromHoursResponse"},"InvoiceLineCreate":{"properties":{"description":{"type":"string","maxLength":1000,"minLength":1,"title":"Description"},"hours":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Hours"},"rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Rate"},"amount":{"type":"number","maximum":10000000.0,"minimum":0.0,"title":"Amount"},"sort_order":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Sort Order","default":0}},"type":"object","required":["description","amount"],"title":"InvoiceLineCreate"},"InvoiceLineRead":{"properties":{"id":{"type":"integer","title":"Id"},"invoice_id":{"type":"integer","title":"Invoice Id"},"description":{"type":"string","maxLength":1000,"minLength":1,"title":"Description"},"hours":{"anyOf":[{"type":"number","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Hours"},"rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Rate"},"amount":{"type":"number","title":"Amount"},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["id","invoice_id","description","amount"],"title":"InvoiceLineRead"},"InvoicePreviewRequest":{"properties":{"invoice_number":{"type":"string","maxLength":100,"title":"Invoice Number","default":"CONCEPT"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"client_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Client Name"},"client_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Client Address"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"subtotal":{"type":"number","title":"Subtotal","default":0.0},"vat_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vat Rate","default":21.0},"vat_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vat Amount"},"total_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Amount"},"total_hours":{"type":"number","title":"Total Hours","default":0.0},"reverse_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reverse Charge"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"payment_reference":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Payment Reference"},"template_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Fields"},"lines":{"items":{"$ref":"#/components/schemas/PreviewLineItem"},"type":"array","maxItems":200,"title":"Lines","default":[]}},"type":"object","title":"InvoicePreviewRequest","description":"Form data for live PDF preview — unsaved, client may be unresolved."},"InvoiceUpdate":{"properties":{"invoice_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Invoice Number"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"subtotal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Subtotal"},"vat_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Vat Rate"},"total_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Total Hours"},"reverse_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reverse Charge"},"status":{"anyOf":[{"type":"string","enum":["draft","sent","paid","overdue","archived"]},{"type":"null"}],"title":"Status"},"payment_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Payment Date"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"pdf_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Pdf Path"},"lines":{"anyOf":[{"items":{"$ref":"#/components/schemas/InvoiceLineCreate"},"type":"array","maxItems":200},{"type":"null"}],"title":"Lines"},"time_entry_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":1000},{"type":"null"}],"title":"Time Entry Ids"},"recurring":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recurring"},"recurrence_interval":{"anyOf":[{"type":"string","enum":["monthly","quarterly","annual"]},{"type":"null"}],"title":"Recurrence Interval"},"recurrence_anchor_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Anchor Day"},"recurrence_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurrence Project Id"},"parent_invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Invoice Id"},"payment_reference":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Payment Reference"},"template_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Fields"}},"type":"object","title":"InvoiceUpdate","description":"All fields optional — supports partial updates (e.g. status-only)."},"LabCurvesRequest":{"properties":{"projected_hours":{"type":"number","title":"Projected Hours","default":1000},"non_billable_hours":{"type":"number","title":"Non Billable Hours","default":225},"hourly_rate":{"type":"number","title":"Hourly Rate","default":85},"deductible_costs":{"type":"number","title":"Deductible Costs","default":0},"aov_monthly":{"type":"number","title":"Aov Monthly","default":0},"pension_monthly":{"type":"number","title":"Pension Monthly","default":0},"buffer_percentage":{"type":"number","title":"Buffer Percentage","default":15},"liquid_reserves":{"type":"number","title":"Liquid Reserves","default":0},"monthly_personal_spend":{"type":"number","title":"Monthly Personal Spend","default":0},"tax_reserve_monthly":{"type":"number","title":"Tax Reserve Monthly","default":0},"emp_pension_enabled":{"type":"boolean","title":"Emp Pension Enabled","default":true},"emp_pension_pct":{"type":"number","title":"Emp Pension Pct","default":10.0},"emp_pension_split_employer":{"type":"number","title":"Emp Pension Split Employer","default":0.5},"retainer_income":{"type":"number","title":"Retainer Income","default":0},"fixed_income":{"type":"number","title":"Fixed Income","default":0},"retainer_hours":{"type":"number","title":"Retainer Hours","default":0},"fixed_hours":{"type":"number","title":"Fixed Hours","default":0}},"type":"object","title":"LabCurvesRequest","description":"Request for lab curve data — sweeps one variable while holding others fixed."},"LocaleSettings":{"properties":{"currency":{"type":"string","title":"Currency","default":"EUR"},"number_format":{"type":"string","title":"Number Format","default":"nl_NL"},"time_format":{"type":"string","title":"Time Format","default":"24h"},"date_format":{"type":"string","title":"Date Format","default":"dd-mm-yyyy"},"default_workday_hours":{"type":"number","maximum":24.0,"minimum":0.5,"title":"Default Workday Hours","default":7.0},"default_start_time":{"type":"string","maxLength":8,"title":"Default Start Time","default":"10:00"},"default_end_time":{"type":"string","maxLength":8,"title":"Default End Time","default":"17:00"},"default_hourly_rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Default Hourly Rate"},"default_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Client Id"}},"type":"object","title":"LocaleSettings","description":"Locale and display settings"},"MonthlyTimeEntriesSummary":{"properties":{"workdays":{"items":{"type":"string","format":"date"},"type":"array","title":"Workdays"},"entries_dict":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/TimeEntry"},{"type":"null"}]},"type":"object","title":"Entries Dict"},"today":{"type":"string","format":"date","title":"Today"},"month_name":{"type":"string","title":"Month Name"},"year":{"type":"integer","title":"Year"},"projected_hours":{"type":"number","title":"Projected Hours"},"projected_income":{"type":"number","title":"Projected Income"},"actual_hours":{"type":"number","title":"Actual Hours"},"actual_income":{"type":"number","title":"Actual Income"}},"type":"object","required":["workdays","entries_dict","today","month_name","year","projected_hours","projected_income","actual_hours","actual_income"],"title":"MonthlyTimeEntriesSummary"},"NonBillableActivity":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"type":"string","maxLength":100,"title":"Category"},"subcategory":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Subcategory"},"active":{"type":"boolean","title":"Active","default":true},"id":{"type":"integer","title":"Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","category","id","created_at"],"title":"NonBillableActivity"},"NonBillableActivityCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"type":"string","maxLength":100,"title":"Category"},"subcategory":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Subcategory"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name","category"],"title":"NonBillableActivityCreate"},"NonBillableActivityUpdate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"type":"string","maxLength":100,"title":"Category"},"subcategory":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Subcategory"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name","category"],"title":"NonBillableActivityUpdate"},"NoteCreate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title"},"body":{"type":"string","maxLength":10000,"title":"Body"}},"type":"object","required":["body"],"title":"NoteCreate"},"NoteResponse":{"properties":{"id":{"type":"integer","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"integer","title":"Entity Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"type":"string","title":"Body"},"user_id":{"type":"integer","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","entity_type","entity_id","body","user_id","created_at","updated_at"],"title":"NoteResponse"},"NoteUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title"},"body":{"type":"string","maxLength":10000,"title":"Body"}},"type":"object","required":["body"],"title":"NoteUpdate"},"OAuth2AuthorizeResponse":{"properties":{"authorization_url":{"type":"string","title":"Authorization Url"}},"type":"object","required":["authorization_url"],"title":"OAuth2AuthorizeResponse"},"PayResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"}},"type":"object","required":["checkout_url"],"title":"PayResponse"},"PortalInvoice":{"properties":{"id":{"type":"integer","title":"Id"},"invoice_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Number"},"invoice_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Date"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"total_amount":{"type":"number","title":"Total Amount"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","total_amount","status"],"title":"PortalInvoice"},"PortalResponse":{"properties":{"freelancer_name":{"type":"string","title":"Freelancer Name"},"client_name":{"type":"string","title":"Client Name"},"client_lang":{"type":"string","title":"Client Lang"},"workspace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Slug"},"branding":{"additionalProperties":true,"type":"object","title":"Branding"},"has_custom_portal":{"type":"boolean","title":"Has Custom Portal","default":false},"payments_enabled":{"type":"boolean","title":"Payments Enabled","default":false},"invoices":{"items":{"$ref":"#/components/schemas/PortalInvoice"},"type":"array","title":"Invoices"}},"type":"object","required":["freelancer_name","client_name","client_lang","branding","invoices"],"title":"PortalResponse"},"PreviewLineItem":{"properties":{"description":{"type":"string","maxLength":1000,"title":"Description","default":""},"hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hours"},"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","title":"PreviewLineItem","description":"Loose line item for preview — amount is computed if not provided."},"PreviewRow":{"properties":{"row_number":{"type":"integer","title":"Row Number"},"status":{"type":"string","title":"Status","default":"ok"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"fields":{"additionalProperties":true,"type":"object","title":"Fields","default":{}},"client_is_new":{"type":"boolean","title":"Client Is New","default":false}},"type":"object","required":["row_number"],"title":"PreviewRow","description":"One row in the preview table — parsed or flagged."},"Project":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable_default":{"type":"boolean","title":"Billable Default","default":true},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"budget":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Budget"},"status":{"type":"string","enum":["active","completed","archived","on_hold"],"title":"Status","default":"active"},"project_type":{"type":"string","enum":["folder","hourly","fixed","retainer"],"title":"Project Type","default":"hourly"},"retainer_monthly":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Monthly"},"retainer_hours_per_month":{"anyOf":[{"type":"integer","maximum":744.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Hours Per Month"},"retainer_interval":{"anyOf":[{"type":"string","enum":["monthly","quarterly","annual"]},{"type":"null"}],"title":"Retainer Interval","default":"monthly"},"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"}},"type":"object","required":["name","id","user_id","created_at","updated_at"],"title":"Project"},"ProjectCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable_default":{"type":"boolean","title":"Billable Default","default":true},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"budget":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Budget"},"status":{"type":"string","enum":["active","completed","archived","on_hold"],"title":"Status","default":"active"},"project_type":{"type":"string","enum":["folder","hourly","fixed","retainer"],"title":"Project Type","default":"hourly"},"retainer_monthly":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Monthly"},"retainer_hours_per_month":{"anyOf":[{"type":"integer","maximum":744.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Hours Per Month"},"retainer_interval":{"anyOf":[{"type":"string","enum":["monthly","quarterly","annual"]},{"type":"null"}],"title":"Retainer Interval","default":"monthly"}},"type":"object","required":["name"],"title":"ProjectCreate"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"active":{"type":"boolean","title":"Active","default":true},"billable_default":{"type":"boolean","title":"Billable Default","default":true},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"budget":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Budget"},"status":{"type":"string","enum":["active","completed","archived","on_hold"],"title":"Status","default":"active"},"project_type":{"type":"string","enum":["folder","hourly","fixed","retainer"],"title":"Project Type","default":"hourly"},"retainer_monthly":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Monthly"},"retainer_hours_per_month":{"anyOf":[{"type":"integer","maximum":744.0,"minimum":0.0},{"type":"null"}],"title":"Retainer Hours Per Month"},"retainer_interval":{"anyOf":[{"type":"string","enum":["monthly","quarterly","annual"]},{"type":"null"}],"title":"Retainer Interval","default":"monthly"}},"type":"object","title":"ProjectUpdate"},"Rate":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"activity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"},"rate_per_hour":{"type":"string","title":"Rate Per Hour"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["client_id","rate_per_hour","valid_from","id","created_at"],"title":"Rate"},"RateAdoptRequest":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"rate_per_hour":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"string"}],"title":"Rate Per Hour"},"from_date":{"type":"string","format":"date","title":"From Date"}},"type":"object","required":["client_id","rate_per_hour","from_date"],"title":"RateAdoptRequest","description":"A rate typed into the timesheet, to become the client's rate from the\nentry's date onwards (RateService.adopt_entry_rate)."},"RateAdoptResult":{"properties":{"action":{"type":"string","title":"Action"},"rate_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Id"},"previous_rate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Rate"},"restore":{"items":{"$ref":"#/components/schemas/RateRestore"},"type":"array","title":"Restore","default":[]}},"type":"object","required":["action"],"title":"RateAdoptResult","description":"What adopting did, and what an undo has to put back.\n\naction: \"created\" (a new history row from from_date), \"updated\" (a row\nalready started that day; its rate changed), \"unchanged\" (that rate was\nalready in force), or \"past\" (the entry predates the client's latest rate\nchange: a correction to that entry, history untouched)."},"RateCreate":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"activity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"},"rate_per_hour":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"string"}],"title":"Rate Per Hour"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"}},"type":"object","required":["client_id","rate_per_hour","valid_from"],"title":"RateCreate"},"RateHistory":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"client_name":{"type":"string","title":"Client Name"},"rates":{"items":{"$ref":"#/components/schemas/Rate"},"type":"array","title":"Rates"},"current_rate":{"anyOf":[{"$ref":"#/components/schemas/Rate"},{"type":"null"}]}},"type":"object","required":["client_id","client_name","rates"],"title":"RateHistory"},"RateRestore":{"properties":{"id":{"type":"integer","title":"Id"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"}},"type":"object","required":["id"],"title":"RateRestore"},"RateUpdate":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"activity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"},"rate_per_hour":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Rate Per Hour"},"valid_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"}},"type":"object","title":"RateUpdate"},"RateWithClient":{"properties":{"client_id":{"type":"integer","title":"Client Id"},"activity_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Activity Id"},"rate_per_hour":{"type":"string","title":"Rate Per Hour"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"activity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activity Name"}},"type":"object","required":["client_id","rate_per_hour","valid_from","id","created_at"],"title":"RateWithClient"},"ReactivateResponse":{"properties":{"billing":{"anyOf":[{"$ref":"#/components/schemas/BillingStatusResponse"},{"type":"null"}]},"needs_checkout":{"type":"boolean","title":"Needs Checkout","default":false},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"}},"type":"object","title":"ReactivateResponse"},"Receipt":{"properties":{"id":{"type":"integer","title":"Id"},"content_type":{"type":"string","title":"Content Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"}},"type":"object","required":["id","content_type","size_bytes"],"title":"Receipt"},"RecurringCost":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"monthly_amount":{"type":"string","title":"Monthly Amount"},"billing_interval":{"type":"string","title":"Billing Interval","default":"month"},"interval_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interval Amount"},"receipts":{"items":{"$ref":"#/components/schemas/Receipt"},"type":"array","title":"Receipts","default":[]},"tax_deductible":{"type":"boolean","title":"Tax Deductible"},"active_from":{"type":"string","format":"date","title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["id","user_id","name","category","monthly_amount","tax_deductible","active_from","active_until","notes"],"title":"RecurringCost"},"RecurringCostCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"category":{"type":"string","maxLength":100,"title":"Category"},"billing_interval":{"type":"string","enum":["month","quarter","year"],"title":"Billing Interval","default":"month"},"interval_amount":{"anyOf":[{"type":"number","maximum":12000000.0,"exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Interval Amount"},"monthly_amount":{"anyOf":[{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Monthly Amount"},"tax_deductible":{"type":"boolean","title":"Tax Deductible","default":true},"active_from":{"type":"string","format":"date","title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"}},"type":"object","required":["name","category","active_from"],"title":"RecurringCostCreate"},"RecurringCostSummary":{"properties":{"monthly_deductible":{"type":"number","title":"Monthly Deductible"},"monthly_non_deductible":{"type":"number","title":"Monthly Non Deductible"},"monthly_total":{"type":"number","title":"Monthly Total"},"annual_deductible":{"type":"number","title":"Annual Deductible"},"annual_total":{"type":"number","title":"Annual Total"}},"type":"object","required":["monthly_deductible","monthly_non_deductible","monthly_total","annual_deductible","annual_total"],"title":"RecurringCostSummary"},"RecurringCostUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"monthly_amount":{"anyOf":[{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Monthly Amount"},"billing_interval":{"anyOf":[{"type":"string","enum":["month","quarter","year"]},{"type":"null"}],"title":"Billing Interval"},"interval_amount":{"anyOf":[{"type":"number","maximum":12000000.0,"exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Interval Amount"},"tax_deductible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tax Deductible"},"active_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"}},"type":"object","title":"RecurringCostUpdate"},"SessionOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"device_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Label"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"type":"string","format":"date-time","title":"Last Used At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["id","name","device_label","ip_address","location","created_at","last_used_at","expires_at"],"title":"SessionOut"},"SessionRename":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"SessionRename"},"Settings":{"properties":{"user_id":{"type":"integer","title":"User Id"},"json_data":{"additionalProperties":true,"type":"object","title":"Json Data","default":{}},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"}},"type":"object","required":["user_id"],"title":"Settings"},"SettingsCreate":{"properties":{"user_id":{"type":"integer","title":"User Id"},"json_data":{"additionalProperties":true,"type":"object","title":"Json Data","default":{}}},"type":"object","required":["user_id"],"title":"SettingsCreate"},"SurfacePreviewRequest":{"properties":{"html_source":{"type":"string","title":"Html Source"}},"type":"object","required":["html_source"],"title":"SurfacePreviewRequest"},"SurfaceUpdate":{"properties":{"html_source":{"type":"string","title":"Html Source"},"status":{"type":"string","title":"Status","default":"draft"},"owner_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner User Id"}},"type":"object","required":["html_source"],"title":"SurfaceUpdate"},"SyncResponse":{"properties":{"status":{"type":"string","title":"Status"},"paid":{"type":"boolean","title":"Paid"}},"type":"object","required":["status","paid"],"title":"SyncResponse"},"TaxPeriod":{"properties":{"year":{"type":"integer","title":"Year"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"}},"type":"object","required":["year","start_date","end_date","id"],"title":"TaxPeriod"},"TaxPeriodCreate":{"properties":{"year":{"type":"integer","title":"Year"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["year","start_date","end_date"],"title":"TaxPeriodCreate"},"TemplateCreate":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tier":{"type":"string","title":"Tier","default":"pro"},"typ_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Typ Source"},"field_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Field Schema"},"defaults":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Defaults"}},"type":"object","required":["slug","name"],"title":"TemplateCreate"},"TemplatePreviewRequest":{"properties":{"source":{"type":"string","title":"Source"},"field_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Field Values"},"branding":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Branding"}},"type":"object","required":["source"],"title":"TemplatePreviewRequest"},"TemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"typ_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Typ Source"},"field_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Field Schema"},"defaults":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Defaults"}},"type":"object","title":"TemplateUpdate"},"TimeEntry":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Id"},"date":{"type":"string","format":"date","title":"Date"},"start_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"End Time"},"hours":{"type":"number","maximum":24.0,"minimum":0.0,"title":"Hours","default":0.0},"rate":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Rate","default":0.0},"activities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Activities"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"billable":{"type":"boolean","title":"Billable","default":true},"status":{"type":"string","maxLength":50,"title":"Status","default":"worked"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"invoice_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Status"},"invoice_due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Due Date"}},"type":"object","required":["date","id","created_at","updated_at"],"title":"TimeEntry"},"TimeEntryBulkCreate":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/TimeEntryCreate"},"type":"array","maxItems":200,"minItems":1,"title":"Entries"}},"type":"object","required":["entries"],"title":"TimeEntryBulkCreate","description":"Paste, duplicate and undo-restore: many rows in one request."},"TimeEntryBulkDelete":{"properties":{"dates":{"items":{"type":"string","format":"date"},"type":"array","maxItems":366,"title":"Dates"},"confirm_delete":{"type":"boolean","title":"Confirm Delete","default":false}},"type":"object","required":["dates"],"title":"TimeEntryBulkDelete"},"TimeEntryBulkDeleteById":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Ids"}},"type":"object","required":["ids"],"title":"TimeEntryBulkDeleteById","description":"Delete these exact rows. (`TimeEntryBulkDelete` deletes by date: every\nentry on each day, which is not what deleting a selection means.)"},"TimeEntryBulkUpdate":{"properties":{"dates":{"items":{"type":"string","format":"date"},"type":"array","maxItems":366,"title":"Dates"},"status":{"type":"string","maxLength":50,"title":"Status"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"start_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"End Time"},"hours":{"anyOf":[{"type":"number","maximum":24.0,"minimum":0.0},{"type":"null"}],"title":"Hours"},"rate":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Rate"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"activities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Activities"},"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},"type":"object","required":["dates","status"],"title":"TimeEntryBulkUpdate"},"TimeEntryCreate":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Id"},"date":{"type":"string","format":"date","title":"Date"},"start_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"End Time"},"hours":{"type":"number","maximum":24.0,"minimum":0.0,"title":"Hours","default":0.0},"rate":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Rate","default":0.0},"activities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Activities"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"billable":{"type":"boolean","title":"Billable","default":true},"status":{"type":"string","maxLength":50,"title":"Status","default":"worked"}},"type":"object","required":["date"],"title":"TimeEntryCreate"},"TimeEntryUpdate":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Id"},"date":{"type":"string","format":"date","title":"Date"},"start_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"End Time"},"hours":{"type":"number","maximum":24.0,"minimum":0.0,"title":"Hours","default":0.0},"rate":{"type":"number","maximum":100000.0,"minimum":0.0,"title":"Rate","default":0.0},"activities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Activities"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"billable":{"type":"boolean","title":"Billable","default":true},"status":{"type":"string","maxLength":50,"title":"Status","default":"worked"}},"type":"object","required":["date"],"title":"TimeEntryUpdate"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser","default":false},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","default":false},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"business_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Business Name"},"lang":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Lang"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"chamber_of_commerce":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Chamber Of Commerce"},"address_line1":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"phone_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone Number"}},"type":"object","required":["email","password"],"title":"UserCreate"},"UserCreateWithInvite":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser","default":false},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","default":false},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"business_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Business Name"},"lang":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Lang"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"chamber_of_commerce":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Chamber Of Commerce"},"address_line1":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"phone_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone Number"},"invite_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Code"},"company_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Url"},"render_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Render Ms"},"turnstile_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turnstile Token"}},"type":"object","required":["email","password"],"title":"UserCreateWithInvite"},"UserRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"business_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Business Name"},"business_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Business Start Date"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"chamber_of_commerce":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Chamber Of Commerce"},"address_line1":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"iban":{"anyOf":[{"type":"string","maxLength":34},{"type":"null"}],"title":"Iban"},"iban_account_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Iban Account Name"},"default_currency":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Default Currency"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone"},"phone_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone Number"},"onboarding_complete":{"type":"boolean","title":"Onboarding Complete","default":false},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"},"workspace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Slug"},"plan":{"type":"string","title":"Plan","default":"free"},"marketing_opt_out":{"type":"boolean","title":"Marketing Opt Out","default":false},"is_admin":{"type":"boolean","title":"Is Admin","description":"Whether this user has Captain's-deck access — the SAME rule the backend\nenforces (is_superuser OR the ADMIN_USER_IDS allowlist), so the nav link\nmatches reality. Gating the link on is_superuser alone hid the deck from an\nallowlisted admin who isn't a DB superuser. Reuses admin._admin_user_ids\n(SSOT); imported lazily to avoid a router↔schema import cycle.","readOnly":true}},"type":"object","required":["id","email","is_admin"],"title":"UserRead"},"UserUpdate":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"business_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Business Name"},"lang":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Lang"},"business_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Business Start Date"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"chamber_of_commerce":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Chamber Of Commerce"},"address_line1":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City"},"postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Postal Code"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"iban":{"anyOf":[{"type":"string","maxLength":34},{"type":"null"}],"title":"Iban"},"iban_account_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Iban Account Name"},"default_currency":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Default Currency"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone"},"phone_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone Number"},"marketing_opt_out":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Marketing Opt Out"}},"type":"object","title":"UserUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WidgetSettings":{"properties":{"enabled_widgets":{"items":{"type":"string"},"type":"array","title":"Enabled Widgets","default":["current_month","invoice_draft","invoice_sent","invoice_overdue","invoice_paid","blended_rate","effective_rate","tax_overview","future_projection","quarterly_performance","gross_revenue_projection","dutch_tax_deductions","quarterly_vat_obligations","tax_savings_recommendations"]},"widget_order":{"additionalProperties":{"type":"integer"},"type":"object","title":"Widget Order","default":{}},"widget_layout":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Widget Layout","default":{}},"hidden_widgets":{"items":{"type":"string"},"type":"array","title":"Hidden Widgets","default":[]},"widget_categories_enabled":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Widget Categories Enabled","default":{"time_tracking":true,"invoicing":true,"financial":true,"projections":true,"analytics":true}}},"type":"object","title":"WidgetSettings","description":"Dashboard widget configuration and preferences"},"_AiKeyUpdate":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"_AiKeyUpdate"},"_BrandingUpdate":{"properties":{"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Color"},"show_powered_by":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Powered By"}},"type":"object","title":"_BrandingUpdate"},"_EmailPreviewRequest":{"properties":{"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Color"},"show_powered_by":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Powered By"},"lang":{"type":"string","title":"Lang","default":"nl"}},"type":"object","title":"_EmailPreviewRequest"},"_InvoicePdfPreviewRequest":{"properties":{"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template","default":"invoice"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"accent_color_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color Mode"},"accent_cmyk":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Accent Cmyk"},"muted_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Muted Color"},"muted_color_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Muted Color Mode"},"muted_cmyk":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Muted Cmyk"},"text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Color"},"text_color_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Color Mode"},"text_cmyk":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Text Cmyk"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_size_mm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Logo Size Mm"},"page_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Size"},"footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Text"},"footer_text_nl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Text Nl"},"footer_text_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Text En"},"layout":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Layout"},"table_style":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Table Style"},"typography":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Typography"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Id"},"custom":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","default":"pdf"}},"type":"object","title":"_InvoicePdfPreviewRequest"},"_MollieKeyUpdate":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"_MollieKeyUpdate"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/jwt/login"}}}}}}