{"openapi":"3.1.0","info":{"title":"POST /api/v1/recurring","version":"1.0.0","description":"Create recurring template"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/recurring":{"post":{"tags":["recurring"],"summary":"Create recurring template","description":"Create a new recurring invoice or bill template.","operationId":"create_recurring_template_api_v1_recurring_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-business-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Business-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringTemplateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringTemplateResponse"}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"example":{"detail":"Invalid request parameters"}}}},"401":{"description":"Unauthorized - Authentication required","content":{"application/json":{"example":{"detail":"Not authenticated"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"detail":"Not enough permissions"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"detail":"Resource not found"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CustomerSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["id"],"title":"CustomerSummary","description":"Summary of customer for response."},"FrequencyEnum":{"type":"string","enum":["daily","weekly","biweekly","monthly","quarterly","annually"],"title":"FrequencyEnum","description":"Recurrence frequency options."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"RecurrenceTypeEnum-Output":{"type":"string","enum":["invoice","bill"],"title":"RecurrenceTypeEnum","description":"Type of recurring document."},"RecurringStatusEnum":{"type":"string","enum":["active","paused","completed","cancelled"],"title":"RecurringStatusEnum","description":"Status of the recurring template."},"RecurringTemplateCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Name/description of this recurring template"},"currency":{"type":"string","title":"Currency","description":"Currency for generated documents (USD, CAD, AUD, EUR, or GBP)","default":"USD"},"frequency":{"$ref":"#/components/schemas/FrequencyEnum","description":"How often to generate"},"days_until_due":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Days Until Due","description":"Days from generation until due date","default":30},"day_of_month":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Day Of Month","description":"Day of month (1-31). Only applies to monthly/quarterly/annually frequencies; ignored for daily/weekly/biweekly. If the day doesn't exist in a month (e.g., 31 in February), generates on the last day instead. If omitted, uses the day from start_date."},"day_of_week":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Day Of Week","description":"Day of week (0=Monday, 6=Sunday). Only applies to weekly/biweekly frequencies; ignored for other frequencies. If omitted, uses the weekday from start_date."},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"Stop generating after this date (null = indefinite). If both end_date and max_occurrences are set, whichever is reached first stops generation."},"max_occurrences":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Occurrences","description":"Stop after generating this many documents (null = unlimited). If both end_date and max_occurrences are set, whichever is reached first stops generation."},"notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Notes","description":"Optional notes about this recurring template"},"recurrence_type":{"$ref":"#/components/schemas/app__api__v1__schemas__recurring__recurring__RecurrenceTypeEnum","description":"Type of document to generate"},"start_date":{"type":"string","format":"date","title":"Start Date","description":"When to start generating"},"customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id","description":"Customer ID (required for invoice type)"},"auto_send":{"type":"boolean","title":"Auto Send","description":"Automatically send invoices to customer on generation","default":false},"vendor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Id","description":"Vendor ID (required for bill type)"},"template_data":{"additionalProperties":true,"type":"object","title":"Template Data","description":"Document template data (amount, description, line_items, etc.)"}},"type":"object","required":["name","frequency","recurrence_type","start_date","template_data"],"title":"RecurringTemplateCreate","description":"Schema for creating a recurring template.","example":{"day_of_month":1,"days_until_due":15,"frequency":"monthly","name":"Monthly Rent","recurrence_type":"bill","start_date":"2026-02-01","template_data":{"amount":350000,"description":"Office rent for 123 Main St"},"vendor_id":"01234567-89ab-cdef-0123-456789abcdef"}},"RecurringTemplateResponse":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"type":"string","title":"Business Id"},"name":{"type":"string","title":"Name"},"recurrence_type":{"$ref":"#/components/schemas/RecurrenceTypeEnum-Output"},"status":{"$ref":"#/components/schemas/RecurringStatusEnum"},"frequency":{"$ref":"#/components/schemas/FrequencyEnum"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"next_occurrence":{"type":"string","format":"date","title":"Next Occurrence"},"last_generated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Generated"},"day_of_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day Of Month"},"day_of_week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day Of Week"},"max_occurrences":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Occurrences"},"occurrences_generated":{"type":"integer","title":"Occurrences Generated"},"template_data":{"additionalProperties":true,"type":"object","title":"Template Data"},"days_until_due":{"type":"integer","title":"Days Until Due"},"auto_send":{"type":"boolean","title":"Auto Send"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"customer":{"anyOf":[{"$ref":"#/components/schemas/CustomerSummary"},{"type":"null"}]},"vendor":{"anyOf":[{"$ref":"#/components/schemas/VendorSummary"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"amount_in_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount In Dollars"},"frequency_display":{"type":"string","title":"Frequency Display"},"days_until_next":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until Next"},"is_due":{"type":"boolean","title":"Is Due"},"should_generate":{"type":"boolean","title":"Should Generate"}},"type":"object","required":["id","business_id","name","recurrence_type","status","frequency","start_date","next_occurrence","occurrences_generated","template_data","days_until_due","auto_send","created_at","updated_at","frequency_display","is_due","should_generate"],"title":"RecurringTemplateResponse","description":"Response schema for recurring template.","example":{"amount_in_dollars":3500.0,"auto_send":false,"business_id":"abcdef01-2345-6789-abcd-ef0123456789","created_at":"2026-01-07T12:00:00Z","day_of_month":1,"days_until_due":15,"days_until_next":25,"frequency":"monthly","frequency_display":"Monthly","id":"01234567-89ab-cdef-0123-456789abcdef","is_due":false,"name":"Monthly Rent","next_occurrence":"2026-02-01","occurrences_generated":0,"recurrence_type":"bill","should_generate":false,"start_date":"2026-02-01","status":"active","template_data":{"amount":350000,"description":"Office rent"},"updated_at":"2026-01-07T12:00:00Z","vendor":{"email":"billing@property.com","id":"vendor-uuid","name":"Property Management LLC"}}},"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"},"VendorSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["id"],"title":"VendorSummary","description":"Summary of vendor for response."},"app__api__v1__schemas__recurring__recurring__RecurrenceTypeEnum":{"type":"string","enum":["invoice","bill"],"title":"RecurrenceTypeEnum","description":"Type of recurring document."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}