---
title: "Create or replace a sales-led custom pricing offer for an email"
method: POST
path: "/accountant/admin/custom-pricing"
tags: ["Accountants"]
---

# Create or replace a sales-led custom pricing offer for an email

`POST /accountant/admin/custom-pricing`

## Request

- Base URL: `https://api.medianfi.com/api/v1`
- URL: `https://api.medianfi.com/api/v1/accountant/admin/custom-pricing`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Service-key access requires SERVICE_KEY_CUSTOM_PRICING_ENABLED (default false);
otherwise the operation is concealed with 404. Human accountant access is unchanged.
Records an active offer for an email, voiding any prior active offer for
the same email. Price is taken in whole dollars and stored as cents.
When firstMonthFree is true, checkout grants a 30-day trial.

## Request body

- object
  - `email` string, email, required
  - `monthlyPriceDollars` integer, required
  - `trialDays` integer: Free-trial days before the first charge (0 = none).
  - `firstMonthFree` boolean: Deprecated back-compat alias; maps to a 30-day trial when trialDays is omitted.
  - `expiresAt` string, date-time, nullable
  - `note` string
  - `billingInterval` 'month' | 'year': Default billing interval (month when omitted). An annual offer charges monthlyPriceDollars x 10 once a year and must not carry a trial (422).
  - `allowMonthly` boolean: Annual offers only: the customer may switch to monthly billing at the same band (default true).

## Response `201`

The created offer

- object
  - `success` true, required
  - `data` CustomPricingOffer, required: A sales-led custom pricing offer keyed by email.
    - `id` string, uuid, required
    - `email` string, email, required
    - `monthlyPriceCents` integer, required
    - `monthlyPriceDollars` integer, required
    - `trialDays` integer, required
    - `billingInterval` 'month' | 'year', required
    - `allowMonthly` boolean, required
    - `chargedAmountCents` integer, required: Charged per billing interval at the offer's own interval (annual = monthly x 10).
    - `termStart` string, date, nullable: First day of the customer's paid period once redeemed; null before payment.
    - `termEnd` string, date, nullable: Last day of the customer's paid period once redeemed; null before payment.
    - `paidBillingInterval` 'month' | 'year' | 'null', nullable: Interval the customer actually pays once redeemed (may be month on an annual offer).
    - `paidAmountCents` integer, nullable: Amount the customer is charged per paid interval once redeemed.
    - `status` 'active' | 'redeemed' | 'void', required
    - `note` string, nullable, required
    - `createdByEmail` string, nullable, required
    - `companyId` string, uuid, nullable, required
    - `redeemedAt` string, date-time, nullable, required
    - `expiresAt` string, date-time, nullable, required
    - `offerUrl` string, uri, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required

## Other responses

- `401`: Authentication required
- `403`: Insufficient permissions or not a company member
- `404`: Resource not found
- `422`: Request failed validation

---

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