---
title: "Read Estimate"
method: GET
path: "/api/autopilot/estimate"
tags: ["autopilot"]
---

# Read Estimate

`GET /api/autopilot/estimate`

## Request

- Base URL: `https://api.taxcompass.it` (the document declares no server; this is the origin it was published from)
- URL: `https://api.taxcompass.it/api/autopilot/estimate`
- Auth: HTTP bearer

The live tax position for one year — collected cash, tax on it, unpaid.

Deterministic: the same engine call the public calculators make, over the
ledger. ``year`` defaults to the server's year for the same reason
``/incassi`` does.

A profile is required because the regime parameters live on it; a profile
that names a scheme the engine cannot model is refused here rather than
answered with a number computed from the wrong rules.

## Query parameters

- `year` integer, nullable

## Response `200`

Successful Response

- TaxEstimate: ``GET /api/autopilot/estimate?year=`` — the live cash-basis tax position. ``cash_received`` is the year's collected revenue (``IncassiYear.total``) and the *only* input to ``breakdown``: the forfettario taxes what was banked, so an invoice that is issued but unpaid changes nothing here. It is reported beside it as ``invoiced_unpaid`` precisely so the estimate is not misread as the whole year — that figure is what is still owed, not income yet. ``limit`` is the forfettario revenue ceiling and ``limit_used_pct`` the share of it consumed, uncapped: past 100 the user needs to see by how far, and ``breakdown.eligible`` is what says the regime itself is gone (the engine then reports the ordinario fallback, which is the honest answer to "what do I owe", not an offer). ``by_ateco`` splits ``cash_received`` by activity (AP-093): a user working under two ATECO codes has two coefficients, so no single stored one describes the year. When two or more coded activities carry revenue, ``breakdown`` is computed from the **blended** coefficient ``Σ(revenue_i × coefficient_i) / Σ(revenue_i)`` — the same taxable base quadro LM reaches row by row. With one activity (the ordinary case) the profile's own coefficient is used exactly as before, so nothing about a single-ATECO estimate changes.
  - `year` integer, required
  - `cash_received` string
  - `invoiced_unpaid` string
  - `limit` string, required
  - `limit_used_pct` number
  - `breakdown` Breakdown, required
    - `country` string, required
    - `regime` string, required
    - `revenue_local` number, required
    - `revenue_eur` number, required
    - `currency` 'EUR' | 'PLN' | 'RON', required
    - `social_contributions` number
    - `health_contribution` number
    - `income_tax` number
    - `substitute_tax` number
    - `other_deductions` number
    - `net_local` number
    - `net_eur` number
    - `effective_rate` number, nullable
    - `eligible` boolean
    - `contributions_are_stand_in` boolean
    - `assumptions` string[]
    - `notes` string[]
  - `by_ateco` AtecoRevenue[]
    - `code` string, nullable
    - `revenue` string
    - `coefficient` string, nullable
    - `taxable` string, nullable
  - `set_aside` SetAside: What to put aside for one tax year's income: the tax **and** the contributions. One figure, computed once (``services.deadline_calendar.set_aside_for``) and read by both screens that state it. The home screen and "The year" used to disagree by several thousand euro on the same income, for two reasons that are each fine alone and wrong together: the estimate deducted INPS from the tax base as if it had already been paid, and the calendar — correctly — refused to, but then left the contributions off entirely. A freelancer reading the calendar was told they owed the substitute tax and nothing else, and would have under-saved by the whole INPS bill. ``tax`` is the imposta sostitutiva with no contribution deducted, because the product records no contribution *payment* (L. 190/2014 art. 1 c. 64 deducts contributions *versati*): an upper bound, which is the right direction for a number whose purpose is to be put aside. ``contributions`` is the Gestione Separata contribution charged on the same reddito. ``total`` is their sum.
    - `tax` string, required
    - `contributions` string, required
    - `total` string, required
    - `contributions_scheme` 'gestione_separata'

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/taxcompass/apis/taxcompass-api.md) · [All operations](https://skmtc.dev/taxcompass/apis/taxcompass-api/llms.txt) · [OpenAPI document](https://skmtc.dev/taxcompass/apis/taxcompass-api/revisions/fef5fc6a9b91?raw)
