{"note":"OpenAPI conversion -- returning structured metadata","name":"avaza-com","description":"Avaza API Documentation","version":"v1","base_url":"https://api.avaza.com","endpoints":101,"raw":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Avaza API Documentation\n@base https://api.avaza.com\n@version v1\n@auth OAuth2\n@endpoints 101\n@hint download_for_search\n@toc api(97), ScheduleSeries(4)\n\n@group api\n@endpoint GET /api/Account\n@desc Retrieves configuration details for the authenticated Avaza account, including timesheet settings, currency, branding, and feature flags.\n@returns(200) Returns the account configuration details.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Bill\n@desc Retrieves a paginated list of supplier bills with line items, status, and address details. Supports filtering by company, status, date ranges, and updated date.\n@optional {UpdatedAfter: any # Only return bills updated after this date-time (ISO 8601). Useful for incremental sync., pageSize: any # Number of results per page. Maximum 1000, default 20., pageNumber: any # 1-based page number to retrieve. Default 1., TransactionStatusCode: any # Filter by bill status code, IssueDateFrom: any # Filter by issue date start range, IssueDateTo: any # Filter by issue date end range, DueDateFrom: any # Filter by due date start range, DueDateTo: any # Filter by due date end range, Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending)., CompanyIDFK: any # Filter bills to a specific supplier company by Company ID.}\n@returns(200) Returns a paginated list of bills with line items and address details.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Bill\n@desc Creates a new draft supplier bill (purchase invoice). Optionally creates a new supplier company and contact if no matching company is found.\n@required {model: map # The request body containing the new bill details including supplier, line items, and dates.}\n@returns(200) Returns the created bill with assigned Transaction ID and line items.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Bill/{id}\n@desc Retrieves a single supplier bill by its Transaction ID, including line items, issuer/recipient address details, and web links.\n@required {id: any # Bill Transaction ID number}\n@returns(200) Returns the bill details with line items, issuer/recipient, and links.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/BillPayment\n@desc Retrieves a paginated list of supplier bill payments, including payment allocations to specific bills.\n@optional {UpdatedAfter: any # Only return records updated after this UTC date-time (ISO 8601 format). Useful for incremental sync., pageSize: any # Number of results per page. Maximum 1000, default 20., pageNumber: any # 1-based page number to retrieve. Default 1.}\n@returns(200) Returns a paginated list of bill payments with allocations.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/BillPayment\n@desc Records a new supplier bill payment. Optionally include allocations to apply the payment against specific bills.\n@required {model: map # The request body containing the new bill payment details including amount, supplier, and optional allocations.}\n@returns(200) Returns the created bill payment with allocations.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/BillPayment/{id}\n@desc Retrieves a single supplier bill payment by its Transaction ID, including allocations to bills.\n@required {id: any # The Bill Payment Transaction ID to retrieve.}\n@returns(200) Returns the bill payment details with allocations.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Company/Lookup\n@desc Retrieves a paginated dropdown list of companies. Admins see all companies; non-admins see only companies from projects they are a member of.\n@optional {pageSize: any # Number of results per page. Maximum 1000, default 20., pageNumber: any # 1-based page number to retrieve. Default 1., search: any # Search string to match against Company name.}\n@returns(200) Returns a paginated list of minimal company records (ID and name).\n\n@endpoint GET /api/Company\n@desc Retrieves a paginated list of customer companies with full details including contacts, billing address, and financial settings.\n@optional {UpdatedAfter: any # Only return companies updated after this date-time (ISO 8601). Useful for incremental sync., pageSize: any # Number of results per page. Maximum 1000, default 20., pageNumber: any # 1-based page number to retrieve. Default 1., Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending).}\n@returns(200) Returns a paginated list of companies with full details including contacts.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/Company\n@desc Updates an existing company record. Only fields listed in the FieldsToUpdate array will be modified.\n@required {model: map # The request body containing the CompanyID, the list of field names to update, and the new field values.}\n@returns(200) Returns the updated company details.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Company\n@desc Creates a new customer company record in Avaza.\n@required {model: map # The request body containing the new company details. CompanyName is required.}\n@returns(200) Returns the created company with assigned Company ID.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Company/{id}\n@desc Retrieves a single customer company by its Company ID, including contacts and billing address details.\n@required {id: any # The Company ID to retrieve.}\n@returns(200) Returns the company details with contacts and billing address.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Contact\n@desc Retrieves a paginated list of external contacts (customer contacts) with company association details.\n@optional {UpdatedAfter: any # Only return contacts updated after this date-time., pageSize: any # Number of results per page. Maximum 1000, default 20., pageNumber: any # 1-based page number to retrieve. Default 1., Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending)., CompanyIDFK: any # Filter contacts to a specific company by Company ID.}\n@returns(200) Returns a paginated list of contacts with company association.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Contact\n@desc Creates a new external contact, optionally linked to an existing company. If CompanyName is provided and not matched, a new company is created.\n@required {model: map # The request body containing the new contact details. Firstname, Lastname, and ContactEmail are required.}\n@returns(200) Returns the created contact with assigned Contact ID.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Contact/{id}\n@desc Retrieves a single external contact by their Contact ID.\n@required {id: any # The Contact ID to retrieve.}\n@returns(200) Returns the contact details.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/CreditNote\n@desc Retrieves a paginated list of customer credit notes, including line items and allocations against invoices.\n@optional {UpdatedAfter: any # Only return records updated after this UTC date-time (ISO 8601 format). Useful for incremental sync., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1.}\n@returns(200) Returns a paginated list of credit notes with line items and allocations.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/CreditNote/{id}\n@desc Retrieves a single credit note by its Transaction ID, including line items and invoice allocations.\n@required {id: any # Credit Note ID Number}\n@returns(200) Returns the credit note details with line items and allocations.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Currency\n@desc Retrieves the list of currencies configured in the Avaza account, including currency codes, names, symbols, and decimal places.\n@returns(200) Returns the list of configured currencies.\n\n@endpoint GET /api/Estimate\n@desc Gets list of Estimates\n@optional {UpdatedAfter: any # Only return estimates updated after this date-time., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., EstimateStatusCode: any # Filter by estimate status code, CompanyIDFK: any # Filter estimates to a specific customer company by Company ID., IssueDateFrom: any # Filter by issue date start range, IssueDateTo: any # Filter by issue date end range, ExpiryDateFrom: any # Filter by expiry date start range, ExpiryDateTo: any # Filter by expiry date end range, Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending).}\n@returns(200) Returns a paginated list of estimates with line items.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Estimate\n@desc Creates a new draft estimate (quote). Optionally creates a new customer company and contact if no matching company is found.\n@required {model: map # The request body containing the new estimate details, line items, and optional company/contact information.}\n@returns(200) Returns the created estimate with assigned Estimate ID and line items.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Estimate/{id}\n@desc Retrieves a single estimate by its Estimate ID, including line items, issuer/recipient details, and web links.\n@required {id: any # Estimate Estimate ID number}\n@returns(200) Returns the estimate details with line items, issuer/recipient, and links.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint POST /api/Expense/Attachment\n@desc Uploads a file attachment for an expense. Accepts multipart/form-data with the file content. Returns the uploaded file details including ID and URL.\n@required {File: any # Upload software package}\n@returns(200) Returns the uploaded file attachment details including File Attachment ID and URL.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/ExpenseApproval/Submit\n@desc Submit Expenses for Approval.\n@required {ExpenseIDs: [int(int64)] # A collection of ExpenseID's that should be submitted for approval. If not provided, submits all verified expenses for approval.}\n@optional {UserID: any # The user to submit the Expenses for. Defaults to current user. Only allowed to be different from the current user when the current user has rights to Impersonate other users., SendNotifications: any # Send email alerts to expense approvers. Defaults to true}\n@returns(200) OK\n\n@endpoint GET /api/Expense\n@desc Retrieves a paginated list of expense entries with rich filtering by date range, user, project, category, chargeable/invoiced status, approval status, and merchant.\n@optional {UpdatedAfter: any # Only return expenses updated after this date-time. Format: MM/dd/yyyy hh:mm:ss tt, ExpenseDateFrom: any # Filter expenses with an ExpenseDate on or after this date. Format: MM/dd/yyyy hh:mm:ss tt, ExpenseDateTo: any # Filter expenses with an ExpenseDate on or before this date. Format: MM/dd/yyyy hh:mm:ss tt, UserEmail: any # Filter expenses by the email address of the expense user., UserID: any # Filter expenses by the UserID of the expense user., CategoryName: any # Filter expenses by expense category name (exact match)., CustomerID: any # Filter expenses by Customer/Company ID., ProjectID: any # Filter expenses by Project ID., isChargeable: any # Filter by chargeable (billable) status: true for chargeable, false for non-chargeable., isInvoiced: any # Filter by invoiced status: true for invoiced expenses, false for uninvoiced., ExpenseReimbursementIDFK: any # Filter expenses by a specific reimbursement batch ID., ExpensePaymentMethodIDFK: any # Filter expenses by payment method ID., ExpenseApprovalStatusCode: any # Filter by approval status. Values: Draft, Rejected, Approved, AutoApproved, Pending, Verified., Search: any # Search expenses by matching against Merchant name and Expense Category Name., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # Sort by: DateUpdated, DateCreated, ExpenseDate (append ' desc' for descending).}\n@returns(200) Returns a paginated list of expense entries with full details.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/Expense\n@desc Updates an existing expense entry. Only fields listed in the FieldsToUpdate array will be modified. Requires the ExpenseID and FieldsToUpdate properties.\n@required {model: map # The update request containing the ExpenseID, FieldsToUpdate list, and new field values.}\n@returns(200) Returns the updated expense details.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Expense\n@desc Creates a new expense entry. Requires at minimum an expense date, amount, and expense category (by ID or name).\n@required {model: map # The new expense details.}\n@returns(200) Returns the created expense with assigned Expense ID.\n@errors {401: Unauthorized}\n\n@endpoint DELETE /api/Expense\n@desc Deletes one or more expense entries by their Expense IDs. Returns a result set indicating success or failure for each expense.\n@required {ExpenseIDs: [int(int64)] # A collection of Expense IDs to delete.}\n@returns(200) Returns a result set with success/failure status for each deleted expense.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Expense/{id}\n@desc Retrieves a single expense entry by its Expense ID, including category, project, tax, attachment, and approval details.\n@required {id: any # Expense ID number}\n@returns(200) Returns the expense entry details including category, tax, and attachments.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/ExpenseCategory\n@desc Retrieves the list of expense categories configured in the account, including unit price settings for per-unit expense tracking.\n@optional {isEnabled: any # Optional filter on for enabled/disabled categories. Defaults to true.}\n@returns(200) Returns the list of expense categories with unit price configuration.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/ExpenseGroup/Lookup\n@desc Retrieves a paginated list of expense group/trip names for categorising expenses, with optional search filtering.\n@optional {pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., search: any # Search string to match against Expense Group Name}\n@returns(200) Returns a paginated list of expense group/trip names.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/ExpenseMerchant/Lookup\n@desc Retrieves a minimal dropdown list of expense merchant names for search/autocomplete.\n@optional {pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., search: any # Search string to match against Expense Merchant Name}\n@returns(200) Returns a paginated list of expense merchant names.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/ExpensePaymentMethod/Lookup\n@desc Retrieves the list of expense payment methods configured in the Avaza account.\n@returns(200) Returns the list of expense payment methods.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/ExpenseSummary\n@desc Retrieves aggregated expense statistics for a date range, with optional grouping by up to three dimensions (e.g. Category, Project, User, Month). Requires ExpenseDateFrom and ExpenseDateTo.\n@optional {model.groupBy: any # (Optional) Combine one, two or three levels of Grouping. Combine these possible grouping values: \"Category\", \"ChargeableStatus\", \"Merchant\", \"ApprovalStatus\", \"ReimbursementStatus\", \"Customer\", \"Project\", \"User\", \"Task\", \"Year\", \"Month\", \"Day\", \"Week\"., model.expenseDateFrom: any # (Required) Filter for expenses with expense dates greater or equal to the specified date. e.g. 2019-01-25., model.expenseDateTo: any # (Required) Filter for expenses with an expense date smaller or equal to the specified  date. e.g. 2019-01-25., model.userID: any # (Optional) Defaults to the current user. Provide one or more UserIDs of Users whose expenses should be retrieved. If the current user doesn't have impersonation rights, then they will only see their own data., model.projectID: any # (Optional) Filter by Project}\n@returns(200) Returns aggregated expense totals with optional grouping.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/FileAttachment\n@desc Uploads a single file via multipart/form-data. Send the file in a \"file\" form field.\n@required {file: any # The file to upload (multipart/form-data).}\n@optional {linkToEntityType: any # Optional. One of: \"Task\", \"Expense\", \"Estimate\", \"Invoice\". When supplied, linkToEntityId must also be supplied., linkToEntityId: any # Optional. The target entity's primary key. Required when linkToEntityType is supplied.}\n@returns(200) Returns the uploaded file attachment details.\n@errors {400: Bad request (missing file, oversize, malformed payload, unknown entity)., 401: Unauthorized., 403: Caller lacks the required scope or right., 507: Insufficient storage allowance on the account.}\n\n@endpoint POST /api/FileAttachment/Base64\n@desc Uploads a single file as a base64-encoded JSON body. Designed for MCP clients and other JSON-only callers that can't easily build multipart/form-data requests.\n@required {body: map # Filename, Base64Data, optional ContentType, optional LinkTo.}\n@returns(200) Returns the uploaded file attachment details.\n@errors {400: Bad request (missing/invalid base64, oversize, malformed payload, unknown entity)., 401: Unauthorized., 403: Caller lacks the required scope or right., 507: Insufficient storage allowance on the account.}\n\n@endpoint POST /api/FileAttachment/FromUrl\n@desc Uploads a single file by giving the server a public https URL to fetch from. The server downloads the file (capped at 50 MB, SSRF-protected: blocks RFC1918, loopback, link-local, AWS metadata IPs, and IPv6 ULA).\n@required {body: map # SourceUrl, optional Filename, optional ContentType, optional LinkTo.}\n@returns(200) Returns the uploaded file attachment details.\n@errors {400: Bad request (missing/invalid URL, oversize, blocked source URL, unknown entity)., 401: Unauthorized., 403: Caller lacks the required scope or right., 507: Insufficient storage allowance on the account.}\n\n@endpoint GET /api/FixedAmount\n@desc Retrieves a paginated list of fixed-amount billing entries used for fixed-price project invoicing. Can filter by project, task, invoiced status, and updated date.\n@optional {UpdatedAfter: any # Only return fixed amounts updated after this date-time., ProjectID: any # (Optional) The ProjectID of a Project to filter Fixed Amounts for, TaskID: any # (Optional) The TaskID of a Task to filter Fixed Amounts for, isInvoiced: any # Filter by invoiced status: true for invoiced, false for uninvoiced., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # Optional sorting instruction. Currently possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\"}\n@returns(200) Returns a paginated list of fixed-amount billing entries.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Inventory\n@desc Retrieves a paginated list of inventory/product items configured in the account, used as line items on invoices, bills, and estimates.\n@optional {UpdatedAfter: any # Only return inventory items updated after this date-time., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1.}\n@returns(200) Returns a paginated list of inventory/product items.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Inventory/{id}\n@desc Retrieves a single inventory/product item by its Inventory Item ID.\n@required {id: any # InventoryItem ID number}\n@returns(200) Returns the inventory item details.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Invoice\n@desc Gets list of Invoices\n@optional {UpdatedAfter: any # Only return invoices updated after this date-time., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., TransactionStatusCode: any # Filter by invoice status. Values: Draft, Sent, Late, Paid, Partial, Void., IssueDateFrom: any # Filter invoices issued on or after this date (ISO 8601)., IssueDateTo: any # Filter invoices issued before this date (ISO 8601)., DueDateFrom: any # Filter invoices due on or after this date (ISO 8601)., DueDateTo: any # Filter invoices due before this date (ISO 8601)., Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending)., CompanyIDFK: any # Filter invoices to a specific customer company by Company ID.}\n@returns(200) Returns a paginated list of invoices with line items.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/Invoice\n@desc Updates an existing draft invoice. Only fields listed in the FieldsToUpdate array will be modified. When LineItems is included in FieldsToUpdate, all existing line items not present in the array are deleted.\n@required {model: map # The request body containing the fields to update and their new values.}\n@returns(200) Returns the updated invoice details.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Invoice\n@desc Creates a new draft invoice. Optionally creates a new customer company and contact if no matching company is found.\n@required {model: map # The request body containing the new invoice details, line items, and optional company/contact information.}\n@returns(200) Returns the created invoice with assigned Transaction ID and line items.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Invoice/{id}\n@desc Retrieves a single invoice by its Transaction ID, including line items, issuer/recipient address details, and web links.\n@required {id: any # Invoice Transaction ID number}\n@returns(200) Returns the invoice details with line items, issuer/recipient, and links.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Payment\n@desc Retrieves a paginated list of customer payments, including allocations to specific invoices. Can filter by invoice or updated date.\n@optional {InvoiceTransactionID: any # Filter for Payments that have at least one allocation against a given Invoice Transaction ID, UpdatedAfter: any # Only return records updated after this UTC date-time (ISO 8601 format). Useful for incremental sync., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1.}\n@returns(200) Returns a paginated list of customer payments with allocations.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Payment\n@desc Records a new customer payment. Optionally include allocations to apply the payment against specific invoices.\n@required {model: map # The request body containing the new payment details and optional invoice allocations.}\n@returns(200) Returns the created payment with allocations.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Payment/{id}\n@desc Retrieves a single customer payment by its Transaction ID, including allocations to invoices.\n@required {id: any # Invoice Transaction ID Number}\n@returns(200) Returns the payment details with invoice allocations.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/Project/Lookup\n@desc Retrieves a minimal dropdown list of active projects grouped by customer company, for search/autocomplete. Supports filtering by user timesheet access, company, project code, and search term.\n@optional {pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., TimesheetUserID: any # Filter to the projects that the supplied UserID can add timesheets to., CompanyIDFK: any # Filter projects by customer company ID., search: any # Search term to filter projects by title., ProjectCode: any # Filter by project code.}\n@returns(200) Returns a paginated list of projects grouped by customer company.\n\n@endpoint GET /api/Project\n@desc Retrieves a paginated list of projects with details including status, billing type, budget, category, and date range. Supports filtering by company, category, owner, status, billable type, budget type, and creation date.\n@optional {UpdatedAfter: any # Only return projects updated after this UTC date-time (ISO 8601)., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # A column to sort on. Current possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\", TimesheetUserID: any # Filter to the projects that the supplied UserID can add timesheets to., CompanyID: any # Filter projects belonging to a specific customer company by Company ID., ProjectCategoryID: any # Filter projects by project category ID., ProjectOwnerUserID: any # Filter projects owned by a specific user by User ID., ProjectStatusCode: any # Filter by project status code. Per-account configurable; default codes are NotStarted, InProgress, Complete, OnHold (seeded for every account); admins may add custom codes., ProjectBillableTypeCode: any # Filter by billing type. Values: CategoryHourly, NoRate, NotBillable, PersonHourly, ProjectHourly., ProjectBudgetTypeCode: any # Filter by budget type. Values: CategoryHours, NoBudget, PersonHours, ProjectFees, ProjectHours., DateCreatedFrom: any # Filter projects created on or after this date (ISO 8601)., DateCreatedTo: any # Filter projects created on or before this date (ISO 8601)., includeArchived: any # Include Archived Projects in the results.}\n@returns(200) Returns a paginated list of projects with details.\n\n@endpoint PUT /api/Project\n@desc Updates an existing project. Only fields listed in the FieldsToUpdate array will be modified. When ProjectBillableTypeCode is updated, use ScheduleRateUpdateOption and TimesheetRateUpdateOption to control whether rate changes cascade to existing schedule bookings and timesheet entries respectively.\n@required {model: map # The request body containing the fields to update and their new values.}\n@returns(200) Returns the updated project details.\n\n@endpoint POST /api/Project\n@desc Creates a new project in Avaza, linked to a customer company. Optionally creates a new company if CompanyName is provided and not matched.\n@required {model: map # The request body containing the data for the new project.}\n@returns(200) Returns the created project with assigned Project ID.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Project/{id}\n@desc Retrieves full project details by Project ID, including sections, team members with rates and permissions, and project tags.\n@required {id: any # Project ID number}\n@returns(200) Returns full project details including sections, members, and tags.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/ProjectMember\n@desc Retrieves a list of project members with rates and permissions. Include at least one of ProjectID or UserID parameters.\n@optional {ProjectID: any # Get Project members filtered by ProjectID, UserID: any # Get Project members filtered by UserID}\n@returns(200) Returns the list of project members with rates and permissions.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/ProjectMember\n@desc Updates a project member's rates, budget, or permissions. Only fields listed in the FieldsToUpdate array will be modified.\n@required {model: map # The request body containing the fields to update and their new values.}\n@returns(200) Returns the updated project member details.\n\n@endpoint POST /api/ProjectMember\n@desc Adds a user as a member of a project, setting their rates, budget, and permissions.\n@required {model: map # The request body containing the project ID, user ID, and optional rates and permissions.}\n@returns(200) Returns the new project member assignment details.\n\n@endpoint GET /api/ProjectTimesheetCategory\n@desc Retrieves the list of timesheet/billing categories assigned to projects.\n@optional {ProjectID: any # Get categories filtered by ProjectID}\n@returns(200) Returns the list of timesheet categories assigned to projects.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/ProjectTimesheetCategory\n@desc Updates an existing project timesheet category assignment, including billable status, rate, and budget hours. Optionally cascades rate changes to existing schedule bookings via ScheduleRateUpdateOption and to existing timesheet entries via TimesheetRateUpdateOption.\n@required {model: map # The request body containing the project ID, category ID, and fields to update. Use ScheduleRateUpdateOption to control schedule booking cascade and TimesheetRateUpdateOption to control timesheet entry cascade.}\n@returns(200) Returns the updated timesheet category assignment.\n\n@endpoint POST /api/ProjectTimesheetCategory\n@desc Assigns a timesheet/billing category to a project, specifying billable status, rate, and budget hours.\n@required {model: map # The request body containing the project ID, category ID, and optional rate and budget settings.}\n@returns(200) Returns the new timesheet category assignment.\n\n@endpoint GET /api/RecurringInvoice\n@desc Gets list of Recurring Invoices\n@optional {UpdatedAfter: any # Only return recurring invoice profiles updated after this date-time., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # Sort results by: DateUpdated, DateCreated (append ' desc' for descending)., CompanyIDFK: any # Filter recurring invoices to a specific customer company by Company ID.}\n@returns(200) Returns a paginated list of recurring invoice profiles.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/RecurringInvoice/{id}\n@desc Retrieves a single recurring invoice profile by its ID, including line items, schedule configuration, and next invoice date.\n@required {id: any # Recurring Invoice Profile ID number}\n@returns(200) Returns the recurring invoice profile with line items and schedule.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/ScheduleAssignment\n@desc Gets list of Schedule Assignments.\n@optional {UpdatedAfter: any # Limit results to records updated after the specified date, ScheduleDateFrom: any # Filter for schedule assignement  that are  on or after a specific date, ScheduleDateTo: any # Filter for schedules that are on or before a specific date, ScheduleSeriesID: any # Filter to records for a particular Schedule Series, UserID: any # The UserID of a schedule user to filter assignments for. Only api users with Admin role can see all schedules across all users. Users with ScheduleUser role can access their own ScheduleSeries., UserEmail: any # The email of the user who has been scheduled, pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # Optional sorting instruction. Currently possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\"}\n@returns(200) Returns a paginated list of per-day schedule assignments.\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group ScheduleSeries\n@endpoint POST /ScheduleSeries/AddBooking\n@desc Creates a new project work schedule booking for a user over a date range with specified hours per day or total duration.\n@required {model: map # The booking details including user, project, category, date range, and hours.}\n@returns(200) Returns the created schedule booking with assigned Series ID.\n@errors {401: Unauthorized}\n\n@endpoint POST /ScheduleSeries/AddLeave\n@desc Creates a new leave/time-off schedule booking for a user over a date range.\n@required {model: map # The leave details including user, leave type, date range, and hours per day.}\n@returns(200) Returns the created leave booking with assigned Series ID.\n@errors {401: Unauthorized}\n\n@endpoint PUT /ScheduleSeries/EditLeave\n@desc Updates an existing leave schedule booking.\n@required {model: map # The updated leave details. ScheduleSeriesID is required.}\n@returns(200) Returns the updated leave booking details.\n@errors {401: Unauthorized}\n\n@endpoint PUT /ScheduleSeries/EditBooking\n@desc Updates an existing project work schedule booking.\n@required {model: map # The updated booking details. ScheduleSeriesID is required.}\n@returns(200) Returns the updated schedule booking details.\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group api\n@endpoint GET /api/ScheduleSeries\n@desc Gets list of Schedule Series\n@optional {UpdatedAfter: any # Limit results to records updated after the specified date, ScheduleStartDateFrom: any # Filter for schedules that start on or after a specific date, ScheduleStartDateTo: any # Filter for schedules that start on or before a specific date, ScheduleEndDateFrom: any # Filter for schedules that end on or after a specific date, ScheduleEndDateTo: any # Filter for schedules that end on or before a specific date, UserID: any # The UserID of a schedule user to filter assignments for. Only api users with Admin role can see all schedules across all users. Users with ScheduleUser role can access their own ScheduleSeries., UserEmail: any # The email of the user who has been scheduled, TimeSheetCategoryID: any # Filter for schedule records linked to a specific timesheeet category, TimeSheetCategoryName: any # Filter for schedule records with a specific timesheeet category name (exact string match), LeaveTypeID: any # Filter to records of a particular leave type, ProjectID: any # Filter to only include books linked to a specific project, CompanyID: any # Filter to only include records linked to projects, where that project belongs to a specific customer company, pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., Sort: any # Optional sorting instruction. Currently possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\"}\n@returns(200) Returns a paginated list of schedule series (bookings and leave).\n@errors {401: Unauthorized}\n\n@endpoint POST /api/ScheduleSeries\n@desc Retrieves a paginated list of schedule series matching the provided filter criteria. POST body contains filter parameters.\n@required {seriesFilter: map # A filter object containing criteria for retrieving schedule series records, including date ranges, user, project, and category filters.}\n@returns(200) Returns schedule series matching the filter criteria.\n@errors {401: Unauthorized}\n\n@endpoint DELETE /api/ScheduleSeries/{id}\n@desc Deletes a schedule series (booking or leave) by its Schedule Series ID. Also removes all associated daily schedule assignments.\n@required {id: any # The ID of the Schedule Series to delete}\n@returns(200) Returns confirmation of the schedule series deletion.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Section\n@desc Retrieves a list of sections (task groups) within a project. Requires a ProjectID query parameter.\n@required {ProjectID: any # Get sections for Project with ProjectID}\n@returns(200) Returns the list of sections for the specified project.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Section\n@desc Creates a new section (task group) within a project.\n@required {model: map # The request body containing the project ID and section title.}\n@returns(200) Returns the created section with assigned Section ID.\n\n@endpoint DELETE /api/Section\n@desc Deletes a section by its Section ID. Cannot delete a Section that contains Tasks.\n@required {SectionID: any # The ID of the section to delete.}\n@returns(200) Returns confirmation of the section deletion.\n\n@endpoint GET /api/Task/Lookup\n@desc Retrieves tasks grouped by section within a project for dropdown/autocomplete use. Requires a projectID parameter.\n@required {projectID: any # The Project ID to retrieve tasks for. Required.}\n@optional {pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., hideCompleted: any # (optional) true/false to hide completed tasks. Defaults false, search: any # (optional) Search string to match against Task title. Performs begins-with match}\n@returns(200) Returns tasks grouped by section for the specified project.\n\n@endpoint GET /api/Task\n@desc Retrieves a paginated list of tasks with details including assignees, dates, status, priority, tags, and time tracking. Supports filtering by project, section, status, priority, due date range, assigned user, completion state, and parent task / hierarchy.\n@optional {UpdatedAfter: any # Optional filter to records updated after a specific date., pageSize: any # Number of items per page. Defaults to 20., pageNumber: any # Page to display. Starts from 1. Defaults to 1, Sort: any # Optional sorting instruction. Currently possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\", \"SectionTitle\", \"Title\", isComplete: any # Optional filter to only display tasks linked to a Task Status where isComplete=false, or where isComplete=true, ProjectID: any # Optional filter to only display tasks belonging to a specific ProjectID, TaskStatusCode: any # Optional filter to only display tasks with a specific status, TaskPriorityCode: any # Optional filter to only display tasks with a specific priority, DueDateFrom: any # Optional filter to only display tasks with a Due Date after DueDateFrom, DueDateTo: any # Optional filter to only display tasks with a Due Date before DueDateTo, AssignedToUserIDs: any # Optional filter to only display tasks with at least one of the provided UserIDs set as the Assigned User., ParentTaskIDFK: any # Optional filter to only display subtasks of the given parent task ID (i.e. tasks where ParentTaskIDFK = value)., isRootLevel: any # Optional filter on task hierarchy. true = only root-level tasks (ParentTaskIDFK IS NULL); false = only subtasks (ParentTaskIDFK IS NOT NULL); omitted = no filter.}\n@returns(200) Returns a paginated list of tasks with full details.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/Task\n@desc Update a Task.\n@required {model: map # The request body containing the task ID, fields to update, and updated values.}\n@returns(200) Returns the updated task details.\n\n@endpoint POST /api/Task\n@desc Creates a new task in a project section. Requires ProjectIDFK, SectionIDFK, and Title. Optionally assign users, set dates, priority, estimated effort, and tags.\n@required {model: map # The request body containing the data for the new task.}\n@returns(200) Returns the created task with assigned Task ID.\n\n@endpoint DELETE /api/Task\n@desc Deletes a task by its Task ID.\n@required {TaskID: any # The ID of the task to delete.}\n@returns(200) Returns confirmation of the task deletion.\n\n@endpoint GET /api/Task/{id}\n@desc Retrieves full task details by Task ID, including project context, section, assignees, dates, status, priority, tags, and time tracking information.\n@required {id: any # Task ID number}\n@returns(200) Returns the task details including assignees, tags, and status.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/TaskDiscussion\n@desc Retrieves discussion/comment messages for a specific task, including replies, attachments, and system messages. Supports pagination via startItem.\n@required {TaskID: any # The TaskID of the Task to retrieve messages for}\n@optional {pageSize: any # The max number of responses to return in this page, startItem: any # the ReponseID of the comment from which the page of results should start.}\n@returns(200) Returns discussion messages with replies and attachments for the task.\n\n@endpoint POST /api/TaskDiscussion\n@desc Post a new comment / discussion message to a task. Supports plain comments, internal notes, replies to existing messages, and file attachments.\n@required {model: map # Discussion message payload.}\n@returns(200) The newly created discussion message in the same shape used inside the Get TaskDiscussion responses[] array.\n\n@endpoint GET /api/TaskPriority\n@desc Retrieves all task priority definitions configured in the account. Includes priority code, display name, color, and sort order. Results are ordered by DisplayOrder ascending.\n@returns(200) Returns all task priority definitions.\n\n@endpoint GET /api/TaskStatus\n@desc Retrieves all task status definitions configured in the account, grouped by task type. Includes status codes, display names, colors, sort order, and whether the status represents a completed state.\n@returns(200) Returns all task status definitions grouped by task type.\n\n@endpoint GET /api/TaskType\n@desc Retrieves all task type definitions (workflow types) configured in the account, including name, icon, and whether it is the default type.\n@returns(200) Returns all task type definitions.\n\n@endpoint GET /api/Tax\n@desc Retrieves all tax rates configured in the Avaza account, including tax components for compound taxes.\n@returns(200) Returns all tax rates with components.\n\n@endpoint GET /api/Timesheet/deleted\n@desc Retrieves deleted (tombstone) timesheet entries for synchronisation purposes. Admin access only. Supports filtering by deletion date, entry date range, and user.\n@optional {UserID: any # Filter by user ID, DeletedAfter: any # Filter entries deleted after this UTC date, EntryDateFrom: any # Filter by original timesheet entry date (start), EntryDateTo: any # Filter by original timesheet entry date (end), Sort: any # Sort expression (e.g. 'DeletedDate desc', 'EntryDate'), PageSize: any # Number of items per page, PageNumber: any # Page number (starts from 1)}\n@returns(200) Returns a paginated list of deleted timesheet entries for sync.\n@errors {401: Unauthorized, 403: Forbidden - Admin access only}\n\n@endpoint GET /api/Timesheet\n@desc Retrieves a paginated list of timesheet entries with rich filtering by date range, user, project, task, category, billable/invoiced status, approval status, and running timer state.\n@optional {UpdatedAfter: any # Only return timesheets updated after this date-time., EntryDateFrom: any # Filter timesheets with an entry date on or after this date (ISO 8601)., EntryDateTo: any # Filter timesheets with an entry date on or before this date (ISO 8601)., UserID: any # The UserID of a timesheet user to filter timesheets for. Only api users with certain higher roles can see timesheets across multiple users., UserEmail: any # Filter timesheets by the email address of the timesheet user., CategoryName: any # Filter timesheets by category name., TimesheetEntryApprovalStatusCode: any # Filter by approval status. Values: Draft, Pending, AutoApproved, Approved, Rejected., ProjectID: any # Filter timesheets by Project ID., TaskID: any # Filter timesheets by Task ID., isBillable: any # Filter by billable status: true or false., isInvoiced: any # Filter by invoiced status: true or false., isTimerRunning: any # Filter to only entries that currently have a running timer (true) or not (false)., pageSize: any # Number of items per page (max 1000), pageNumber: any # Page to display. Starts from 1., includeInvoiceDetails: any # When true, includes invoice Transaction ID and line item ID for invoiced entries., Sort: any # Optional sorting instruction. Currently possible values: \"DateUpdated\", \"DateCreated\", \"DateUpdated desc\", \"DateCreated desc\",\"EntryDate\", \"EntryDate desc\", \"StartTimeLocal\",\"StartTimeLocal desc\", \"TimeSheetEntryID\", \"TimeSheetEntryID desc\"}\n@returns(200) Returns a paginated list of timesheet entries with full details.\n@errors {401: Unauthorized}\n\n@endpoint PUT /api/Timesheet\n@desc Updates an existing timesheet entry. Only fields listed in FieldsToUpdate will be modified. ProjectIDFK is always required.\n@required {model: map # The request body containing the updated timesheet fields. Must include TimeSheetEntryID, ProjectIDFK, and FieldsToUpdate.}\n@returns(200) Returns the updated timesheet entry details.\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint POST /api/Timesheet\n@desc Creates a new timesheet entry. If Duration is null or 0, a timer will be started automatically. Requires ProjectIDFK and TimesheetCategoryIDFK.\n@required {model: map # The request body containing the data for the new timesheet entry.}\n@returns(200) Returns the created timesheet entry. If Duration was 0 or null, a timer is started.\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint GET /api/Timesheet/{id}\n@desc Retrieves a single timesheet entry by its Timesheet Entry ID, including user, project, category, approval, and timer details.\n@required {id: any # Timesheet Entry ID number}\n@returns(200) Returns the timesheet entry details with user, project, and approval info.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint DELETE /api/Timesheet/{id}\n@desc Deletes a timesheet entry by its Timesheet Entry ID.\n@required {id: any # The Timesheet Entry ID of the entry to be deleted.}\n@returns(200) Returns confirmation of the timesheet entry deletion.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint POST /api/Timesheets/Approve\n@desc Approves a batch of pending timesheet entries by their TimeSheetEntryIDs. Caller must have the Timesheet Approver role and permission to approve each specific entry. Mixed-eligibility batches return per-entry results.\n@required {model: map # The request body containing the list of TimeSheetEntryIDs to approve and an optional approval note.}\n@returns(200) Returns a summary and per-entry results.\n@errors {400: Bad Request - missing/invalid TimeSheetEntryIDs or note too long., 401: Unauthorized., 403: Forbidden - caller lacks the Timesheet Approver role.}\n\n@endpoint POST /api/Timesheets/Reject\n@desc Rejects a batch of pending or approved timesheet entries by their TimeSheetEntryIDs. Invoiced or paid entries cannot be rejected. Caller must have the Timesheet Approver role and permission to reject each specific entry. By default sends a rejection notification email per affected timesheet user; set SendNotifications=false to suppress.\n@required {model: map # The request body containing the list of TimeSheetEntryIDs to reject, an optional rejection reason, and an optional SendNotifications flag (default true).}\n@returns(200) Returns a summary and per-entry results.\n@errors {400: Bad Request - missing/invalid TimeSheetEntryIDs or reason too long., 401: Unauthorized., 403: Forbidden - caller lacks the Timesheet Approver role.}\n\n@endpoint POST /api/TimesheetSubmission\n@desc Submits timesheet entries for approval. Either provide a specific day (WholeDayOf) or any day within a week (WholeWeekOf) to submit all draft timesheets in that day or week.\n@optional {SendNotifications: any # Send email alerts to timesheet approvers. Defaults to true, WholeWeekOf: any # A date (yyyy-MM-dd) that falls within a week to have all timesheets in that week submitted. Respects the First Day of Week setting in your account Timesheet Settings to determine the week range., WholeDayOf: any # A date (yyyy-MM-dd) to submit all timesheets on this day, UserID: any # The user to submit timesheets for. Defaults to current user. Only allowed to be different from the current user when the current user has rights to Impersonate other users.}\n@returns(200) Returns confirmation that timesheets were submitted for approval.\n@errors {400: Bad Request - WholeDayOf or WholeWeekOf must be provided, 401: Unauthorized}\n\n@endpoint GET /api/TimesheetSummary\n@desc Retrieves aggregated timesheet statistics for a date range, with optional grouping by up to three dimensions (e.g. Project, User, Category, Task, Month). Requires EntryDateFrom and EntryDateTo.\n@optional {model.groupBy: any # (Optional) Combine one, two or three levels of Grouping. Combine these possible grouping values: \"Customer\", \"Project\", \"Category\", \"User\", \"Task\", \"Year\", \"Month\", \"Day\", \"Week\"., model.entryDateFrom: any # (Required) Filter for timesheets greater or equal to the specified date. e.g. 2019-01-25. You can optionally include a time component, otherwise it assumes 00:00, model.entryDateTo: any # (Required) Filter for timesheets with an entry date smaller or equal to the specified  date. e.g. 2019-01-25. You can optionally include a time component, otherwise it assumes 00:00, model.userID: any # (Optional) Defaults to the current user. Provide one or more UserIDs of Users whose timesheets should be retrieved. If the current user doesn't have impersonation rights, then they will only see their own data., model.projectID: any # (Optional) Filter by Project, model.isBillable: any # (Optional) Filter by the billable status of Timesheets., model.isInvoiced: any # (Optional) Filter for timesheets by whether they have been Invoiced or not., model.timesheetEntryApprovalStatusCode: any # (Optional) Filter for timesheets that belong to one of the specified statuses (Draft, Pending, Approved, AutoApproved, Rejected)}\n@returns(200) Returns aggregated timesheet totals with optional grouping.\n@errors {400: Bad Request - EntryDateFrom and EntryDateTo are required, 401: Unauthorized}\n\n@endpoint GET /api/TimesheetTimer\n@desc Checks if there is a currently running timer for the authenticated user (or an impersonated user). Returns timer start time, timesheet entry ID, and server time for clock synchronisation.\n@optional {UserID: any # Optional - User ID number if impersonating a different user. Otherwise assumes the current user. Only users with certain security roles have permission to impersonate other users}\n@returns(200) Returns the running timer status including start time and timesheet entry ID.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint POST /api/TimesheetTimer/{id}\n@desc Starts a timer on an existing timesheet entry. If the entry is not on the current day or start/end times are enabled, a new timesheet entry is created for the timer.\n@required {id: any # ID of the timesheet entry that should be used as the basis for running a timer. If the existing timesheet is not on the current day, or start/end times are enabled, a new timesheet will be created for the timer.}\n@optional {UserID: any # Optional - User ID number if impersonating a different user. Otherwise assumes the current user. Only users with certain security roles have permission to impersonate other users}\n@returns(200) Returns the timer start result including timer start time and timesheet entry ID.\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found}\n\n@endpoint DELETE /api/TimesheetTimer/{id}\n@desc Stops the running timer on a timesheet entry. The elapsed time is added to the entry's duration.\n@required {id: any # The ID of the existing timesheet entry that needs its timer stopped}\n@optional {UserID: any # Optional - User ID number if impersonating a different user. Otherwise assumes the current user. Only users with certain security roles have permission to impersonate other users}\n@returns(200) Returns the timer stop result including final duration.\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found}\n\n@endpoint GET /api/UserProfile\n@desc Get Collection of Users who have roles in the current Avaza account.\n@optional {Roles: any # Optional list of comma separated role codes to filter users by (e.g. \"TimesheetUser,Admin\"), Tags: any # Comma-separated list of user tag names to filter users by., CurrentUserOnly: any # Optional boolean (true/false) to filter to only show current authenticated user (always true for non Admin/Finance Manager users), CompanyIDFK: any # Optionally filter by Company ID, Email: any # Optionally filter by user email address}\n@returns(200) Returns the list of users/team members with roles and tags.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Webhook\n@desc Retrieves all active webhook subscriptions for the authenticated account.\n@returns(200) Returns all active webhook subscriptions.\n@errors {401: Unauthorized}\n\n@endpoint POST /api/Webhook\n@desc Creates a new webhook subscription. On success, returns the ID of the new webhook subscription.\n@required {model: map}\n@returns(201) Subscription created\n@errors {401: Unauthorized, 409: Duplicate subscription already exists}\n\n@endpoint DELETE /api/Webhook\n@desc Deletes a webhook subscription by its callback URL.\n@required {target_url: any # The callback URL of the webhook subscription to delete.}\n@returns(200) Returns confirmation of the webhook deletion.\n@errors {401: Unauthorized}\n\n@endpoint GET /api/Webhook/{id}\n@desc Retrieves a single webhook subscription by its Subscription ID.\n@required {id: any # The numeric Subscription ID of the webhook to retrieve.}\n@returns(200) Returns the webhook subscription details.\n@errors {401: Unauthorized}\n\n@endpoint DELETE /api/Webhook/{id}\n@desc Deletes a webhook subscription by its Subscription ID.\n@required {id: any # The numeric Subscription ID of the webhook to delete.}\n@returns(200) Returns confirmation of the webhook deletion.\n@errors {401: Unauthorized}\n\n@endgroup\n\n@end\n"}