---
title: Cost estimation
description: POST /v1/models/{model}/estimate — find out what a generation costs in credits before running it; no job is created and no credits are reserved.
icon: Calculator
---

Find out what a generation costs in credits without running anything or spending credits.

## Playground

<ApiPlayground path="/v1/models/{model}/estimate" method="post" />

`POST /v1/models/:model/estimate` calculates the cost of the given `input` on the selected model. No job is created and no credits are reserved. Any valid key works — no extra permission is needed.

<Method name="POST" path="/v1/models/:model/estimate" />

## Request

<TypeTable
  type={{
    model: { type: 'string', description: 'Model slug in the path. See GET /v1/models for the list.', required: true },
    input: { type: 'object', description: 'The same parameters you would submit. The schema is in the input_schema field of GET /v1/models/{model}.', required: true }
  }}
/>

<Tabs items={['cURL', 'TypeScript', 'Python']}>
<Tab value="cURL">

```bash
curl -X POST https://api.clipia.ai/v1/models/seedance-2-fast-i2v/estimate \
  -H "Authorization: Bearer $CLIPIA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "prompt": "aerial shot over a neon city",
      "duration": 8,
      "resolution": "1080p"
    }
  }'
```

</Tab>
<Tab value="TypeScript">

```ts
const { credits } = await clipia.models.estimate('seedance-2-fast-i2v', {
  prompt: 'aerial shot over a neon city',
  duration: 8,
  resolution: '1080p',
});
console.log(`This generation will cost ${credits} credits`);
```

</Tab>
<Tab value="Python">

```python
estimate = client.models.estimate(
    "seedance-2-fast-i2v",
    {"prompt": "aerial shot over a neon city", "duration": 8, "resolution": "1080p"},
)
print(f"This generation will cost {estimate.credits} credits")
```

</Tab>
</Tabs>

**Response `200`**

```json
{
  "credits": 40
}
```

<TypeTable
  type={{
    credits: { type: 'integer', description: 'Cost of the given input on this model, in credits' },
    warnings: { type: 'array', description: 'Input parameters the model will not apply. Present only when such parameters were found.' }
  }}
/>

If `input` contains a key the model will not apply (a typo, a parameter of another model), the estimate lists it in `warnings` — in the same form as [submit](/en/docs/api-reference/submit#warnings). This lets you check a set of parameters before launching.

## Why use it

The cost depends on the model and its parameters — duration, resolution, number of images, text length for speech — not on how long the job actually runs. That means you can know it in advance:

- confirm the price before an expensive high-resolution video;
- compare parameter options, such as 4 vs 8 seconds or 720p vs 1080p;
- check the budget in automated flows where software launches the generation.

Submit uses the same calculation: for the same parameters, `credits` matches `cost` in the [`POST /v1/models/{model}`](/en/docs/api-reference/submit) response. Credits are reserved on submit, charged on success, and refunded in full if the generation fails.

<Callout type="info" title="Pricing">
Prices are current as of October 2026. The exact cost is always shown on the run button before anything is charged.
</Callout>

## Errors

| HTTP | `code` | `message` | When |
|------|--------|-----------|------|
| `400` | `invalid_request` | `input_too_large` / `input_too_deep` | `input` exceeds 100,000 bytes or 8 levels of nesting |
| `400` | `invalid_request` | — | `input` isn't an object, or the text for speech is too long |
| `404` | `not_found` | `model_not_found` | no model with this slug |
| `429` | `rate_limit_exceeded` | — | [rate limit](/en/docs/api-reference/rate-limits) exceeded |
| `503` | `service_unavailable` | — | pricing is temporarily unavailable, try again later |
