---
title: "Change Plan"
method: POST
path: "/margot/actions/change_plan"
tags: ["margot"]
---

# Change Plan

`POST /margot/actions/change_plan`

## Request

- Base URL: `https://api.nanocorp.so` (the document declares no server; this is the origin it was published from)
- URL: `https://api.nanocorp.so/margot/actions/change_plan`
- Auth: HTTP bearer

Move the founder to another Founder tier (gated): an upgrade now, a downgrade at the next renewal.

An upgrade charges the difference for the rest of the period and adds its
credits; a downgrade keeps the current period's credits and refunds nothing.

## Request body

- MargotChangePlanRequest
  - `external_id` string, nullable: The founder's NanoCorp user id (external_id on the helpdesk contact).
  - `email` string, nullable: The founder's email. Used as a fallback identity and a cross-check.
  - `company` string, nullable: Optional company name/handle hint, resolved against the caller's own companies.
  - `limit` integer, nullable: Optional row limit for list actions.
  - `requested_by` 'customer' | 'team', required: 'customer': the Customer Agent acting on a founder's ticket. 'team': the Internal Agent acting for a teammate.
  - `ticket_id` string, required: The helpdesk ticket id (customer) or the Parahelp task id (team). A repeated call with the same ticket_id returns the first result instead of acting twice.
  - `ticket_url` string, nullable: https link to the ticket or task, for the audit line.
  - `team_member` string, nullable: The teammate's email. Required when requested_by is 'team'.
  - `from_credits` integer, required: The monthly credits of the plan now, copied from account_summary.plan_credits_per_month: the change runs only from that plan, the one the approval showed.
  - `to_credits` integer, required: The monthly credits of the Founder plan to move to: 30, 60, 120, 240, 480, 960, 1200, 1400, 1600, 1800 or 2000.
  - `note` string, nullable: Internal note, never shown to the founder. Kept to its first 500 characters.

## Response `200`

Successful Response

- MargotChangePlanResponse
  - `found` boolean
  - `outcome` 'done' | 'already_done' | 'pending' | 'refused', required: done: it happened now. already_done: an earlier call of this ticket already did it. pending: the refund went to the bank and its result is unknown, a teammate checks it. refused: nothing happened.
  - `reason` string, nullable: The refusal or pending code. Null when done.
  - `handoff` boolean: True: hand the ticket to a human now.
  - `from_credits` integer, nullable: The monthly credits of the plan before the change.
  - `to_credits` integer, nullable: The monthly credits of the new plan.
  - `direction` 'upgrade' | 'downgrade', nullable: upgrade: the new plan starts today, the difference for the rest of the period is charged now and its extra credits added. downgrade: the new plan starts at the next renewal; the founder keeps the credits of the current period and nothing is refunded.
  - `effective_on` string, nullable: YYYY-MM-DD (UTC) the new plan applies: today, or the next renewal.

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-08** `853cf26118dd`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/nanocorp/apis/nanocorp-api/changes/margot/actions/change_plan/post.md)

---

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