> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nunchux.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Authenticate every request with your API key in the `X-API-Key` header or `Authorization: Bearer`. Keys start with `sk-nunchux-`.
> Image generation is synchronous: the image is in the response.
> Video generation is asynchronous: submit the job, poll its task until it reaches a terminal status, then download the output promptly, because output URLs expire.

# Discounts

> A multiplier on list price, applied per entrypoint.

# Discounts

### A multiplier on list price, applied per entrypoint.

## How discounts work

Your charge is list price × multiplier. The multiplier is specific to your account and to one entrypoint. An entrypoint is a group of models, not a single model.

| Entrypoint | Covers |
| - | - |
| `kling` | Every Kling model, mode, and duration |
| `nunchux` | Nunchux-optimized image and video models |
| `google` | Every Google model. For example, Nano Banana image and Veo 3.1 video. |
| `heygen` | Every HeyGen avatar video model |

One multiplier covers every model behind its entrypoint. You hold at most one active discount per entrypoint, and entrypoints you pay list price for have no row at all.

## Checking your discounts

`GET /v1/discounts` takes no parameters and returns only your own rows. It uses the same API key for [authentication](/authentication) as every other endpoint.

<CodeGroup>
  ```bash curl theme={"system"}
  curl https://api.nunchux.ai/v1/discounts \
    -H "X-API-Key: $NUNCHUX_API_KEY"
  ```

  ```python python theme={"system"}
  import os
  import requests

  response = requests.get(
      'https://api.nunchux.ai/v1/discounts',
      headers={'X-API-Key': os.environ['NUNCHUX_API_KEY']},
      timeout=30,
  )
  response.raise_for_status()

  print(response.json())
  ```
</CodeGroup>

A `200` carries a single `discounts` array, sorted by entrypoint. The API returns [standard error codes](/errors) with a JSON error body.

```json theme={"system"}
{
  "discounts": [
    {
      "entrypoint": "kling",
      "multiplier": 0.9,
      "effective_from": "2026-06-10T00:00:00+00:00",
      "effective_to": null
    },
    {
      "entrypoint": "nunchux",
      "multiplier": 0.9,
      "effective_from": "2026-07-01T00:00:00+00:00",
      "effective_to": "2026-09-30T00:00:00+00:00"
    }
  ]
}
```

| Field | Type | Description |
| - | - | - |
| `entrypoint` | string | Which surface the discount applies to. One of the four entrypoints above. |
| `multiplier` | number | The fraction of list price you pay. |
| `effective_from` | string | ISO-8601 timestamp with UTC offset. When the discount began. Always present. |
| `effective_to` | string \| null | ISO-8601 timestamp, or null for an open-ended discount. When present, the discount ends at this instant (exclusive). |

No active discount is a normal `200`, not an error. An empty array means list price applies everywhere.

```json theme={"system"}
{
  "discounts": []
}
```

The response carries `multiplier` and nothing precomputed, so derive any percentage you want to display yourself.

<Note>
  Polling

  This is a free poll and it never takes a job slot. It still counts toward your [requests per minute](/rate-limits), and a discount changes rarely, so caching the response for minutes is fine. There is no webhook for discount changes.
</Note>

## Reading the multiplier

The `multiplier` field is the fraction of list price you pay.

| Value | Meaning | How to display |
| - | - | - |
| 0 \< m \< 1 | Discount | discount = (1 − m) × 100 %, so m = 0.90 means a 10% discount |
| m = 1 | List price | No discount |

## Time windows

Every discount has a start date and may have an end date.

| Field | Meaning |
| - | - |
| `effective_from` | When the discount starts. |
| `effective_to` | When it ends. A null value means it has no end date. |

The endpoint returns only the discounts that are active now. One that has not started yet, or that has already ended, is left out entirely rather than returned as an inactive row.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.