---
title: "Backdoor / mega-backdoor Roth (pro-rata rule)"
method: POST
path: "/v1/retirement/backdoor-roth"
tags: ["Retirement"]
---

# Backdoor / mega-backdoor Roth (pro-rata rule)

`POST /v1/retirement/backdoor-roth`

## Request

- Base URL: `https://api.numeratica.com`
- URL: `https://api.numeratica.com/v1/retirement/backdoor-roth`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Two Roth accumulation moves for earners over the direct-Roth income limits. The backdoor Roth applies the §408(d)(2) pro-rata rule: a nondeductible traditional-IRA contribution converted to Roth is taxed by basis across all traditional/SEP/SIMPLE IRAs, so a pre-tax balance makes part of the "backdoor" taxable (e.g. $93k pre-tax + $7k basis → 93% taxable). The mega-backdoor computes the after-tax 401(k) room under the §415(c) annual-additions limit (limit − elective deferrals − employer contributions, optionally capped by the plan). Returns the taxable/nontaxable split of the conversion, the basis and pre-tax left afterward, and the §415(c) room. Reuses the grounded contribution-limit tables; deterministic; not tax advice.

## Request body

- BackdoorRothRequest
  - `filing_status` 'single' | 'mfj' | 'mfs' | 'hoh', required
  - `tax_year` 2025 | 2026, required
  - `age` integer, required: Drives the IRA contribution limit (age-50 catch-up).
  - `pretax_ira_balance` number, required: Aggregate pre-tax across all traditional/SEP/SIMPLE IRAs (deductible + earnings).
  - `existing_basis` number: Prior after-tax basis (Form 8606 line 14).
  - `nondeductible_contribution` number, required: New nondeductible contribution this year.
  - `conversion_amount` number: Amount converted to Roth (0 ⇒ the new contribution; capped at the total IRA value).
  - `elective_deferrals` number: Employee 401(k) deferrals (pre-tax + Roth), excluding catch-up.
  - `employer_contributions` number: Employer match + profit-sharing.
  - `plan_after_tax_limit` number: Optional plan cap on after-tax contributions (0 = none).

## Response `200`

The pro-rata split of the conversion + the mega-backdoor room

- BackdoorRothResponse
  - `result_id` string
  - `engine_version` string
  - `inputs` BackdoorRothRequest
    - `filing_status` 'single' | 'mfj' | 'mfs' | 'hoh', required
    - `tax_year` 2025 | 2026, required
    - `age` integer, required: Drives the IRA contribution limit (age-50 catch-up).
    - `pretax_ira_balance` number, required: Aggregate pre-tax across all traditional/SEP/SIMPLE IRAs (deductible + earnings).
    - `existing_basis` number: Prior after-tax basis (Form 8606 line 14).
    - `nondeductible_contribution` number, required: New nondeductible contribution this year.
    - `conversion_amount` number: Amount converted to Roth (0 ⇒ the new contribution; capped at the total IRA value).
    - `elective_deferrals` number: Employee 401(k) deferrals (pre-tax + Roth), excluding catch-up.
    - `employer_contributions` number: Employer match + profit-sharing.
    - `plan_after_tax_limit` number: Optional plan cap on after-tax contributions (0 = none).
  - `result` object
    - `ira_contribution_limit` number: §219 limit incl. the age-50 catch-up.
    - `contribution_within_limit` boolean
    - `total_basis` number: Existing basis + new nondeductible contribution.
    - `total_ira_value` number: Pre-tax + total basis (the pro-rata denominator).
    - `converted_amount` number: Amount actually converted to Roth.
    - `nontaxable_conversion` number: Return of basis (tax-free).
    - `taxable_conversion` number: Pre-tax portion pulled out pro-rata (ordinary income).
    - `taxable_percent` number: taxable / converted.
    - `remaining_basis` number: Basis left in the traditional IRA after the conversion.
    - `remaining_pretax` number: Pre-tax left after the conversion.
    - `is_clean_backdoor` boolean: True when there is no pre-tax balance (conversion fully tax-free).
    - `dc_415c_limit` number: The year's §415(c) annual-additions limit (excl. catch-up).
    - `mega_backdoor_room` number: After-tax room = §415(c) − deferrals − employer (− plan cap).
    - `total_roth_created` number: Converted amount + mega-backdoor room (if both funded).
  - `disclaimer` string

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key.
- `405`: Method not allowed
- `429`: The key's per-minute request budget is exceeded. Retry after the delay in the Retry-After header.
- `503`: A dependency (e.g. the key store) is temporarily unavailable, or the request exceeded its compute deadline. Retryable.

---

[API](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api.md) · [All operations](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api/llms.txt) · [OpenAPI document](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api/revisions/075bcfbd1ebf?raw)
