# `api.reports.sales` > `POST /reports/sales` — ACPortal **Python** ```python api.reports.sales(*, data: SalesForecastReportRequest | dict) -> list[SalesForecastReport] ``` **CLI** ```bash ab reports sales [--data ...] ``` POST /reports/sales. Args: data: Sales forecast payload with date range and agent code filters. Accepts a :class:`SalesForecastReportRequest` instance or a dict. Request model: :class:`SalesForecastReportRequest` ## Request body — `SalesForecastReportRequest` | Field | Type | Required | Description | |---|---|---|---| | `startDate` | `Optional[str]` | no | Range start date (ISO 8601) | | `endDate` | `Optional[str]` | no | Range end date (ISO 8601) | | `agentCode` | `Optional[str]` | no | Agent code filter | | `pageNo` | `Optional[int]` | no | Page number | | `pageSize` | `Optional[int]` | no | Items per page | | `sortBy` | `Optional[dict]` | no | Sort config {sortByField: int, sortDir: bool} | ## Response Returns a list of `List[SalesForecastReport]`. | Field | Type | Required | Description | |---|---|---|---| | `franchisee` | `Optional[str]` | no | Franchisee code | | `company` | `Optional[str]` | no | Company name | | `jobID` | `Optional[str]` | no | Job display ID | | `jobType` | `Optional[str]` | no | Job type | | `quoteDate` | `Optional[str]` | no | Quote date | | `bookedDate` | `Optional[str]` | no | Booked date | | `revenue` | `Optional[float]` | no | Revenue amount | | `profit` | `Optional[float]` | no | Profit amount | | `grossMargin` | `Optional[float]` | no | Gross margin percentage | | `status` | `Optional[str]` | no | Job status | | `industry` | `Optional[str]` | no | Industry type | | `customerZipCode` | `Optional[str]` | no | Customer zip code | | `intacctDate` | `Optional[str]` | no | Intacct sync date | | `totalRecords` | `Optional[int]` | no | Total record count | --- [← Back to api.reports](../reports.md)