# Pricing

The API, the MCP server, apps, keys, webhooks and the integrations are free on every plan, Free included. You pay only
for **AI work**, such as reading drawings, running takeoffs, chat with Exa and generating estimates. It is paid from
the AI usage of the company the work runs in.

## Credits

AI usage is counted in credits. **1 credit is $1.** In other billing currencies a credit has its own price:

| Currency | One credit |
| --- | --- |
| USD | 1 |
| EUR | 0.90 |
| GBP | 0.80 |
| CAD | 1.40 |
| AUD | 1.50 |
| JPY | 150 |
| KRW | 1,400 |
| TWD | 33 |
| VND | 27,000 |
| BRL | 5.30 |
| MXN | 18 |
| INR | 100 |
| PLN | 4 |
| CZK | 22 |
| DKK | 6.50 |

An admin buys credits on the company's billing page: at least 100 credits (presets of 100, 500 and 1,000), at most
10,000 at a time. Outside USD the minimum is 100 credits at the local price.

## Monthly usage that comes with a plan

- **Free:** 30 credits a month for each company, given at the start of each calendar month (UTC). Unused credits do
  not carry over.
- **Paid plans** come with more credits each month per seat. See [exayard.com/pricing](https://exayard.com/pricing).

An admin can turn on extra usage, so work goes on past the monthly amount. Its default limit is $1,000 a month.

## What AI work costs

Most AI work is metered: it is charged from what each call actually uses, such as the model's input and output. The
same kind of call can cost a little more or less each time.

- **Takeoffs** are charged step by step at what each step used, at least 0.01 credits a step. A plan sheet averages
  about 15 credits. That is an average, not a price.
- **Chat, Exa, estimates and text messages** are metered.

A few kinds of work have a fixed price:

| Work | Price |
| --- | --- |
| Voice calls | 0.15 credits a minute, billed by the second, up to 15 minutes |
| Reading tables from a page | 0.15 credits a page |
| Fetching a web page | 0.015 credits |
| A web search | 0.015 credits |

To start some work, the company needs enough usage left. A refusal answers 402
[`insufficient_credits`](https://developers.exayard.com/concepts/errors.md#insufficient_credits). The amount needed to start is not the price.

## What a call cost: the `usage` field

Charged REST resources say what they cost in a `usage` field:

- **Takeoffs.** `GET /v1/assessments/{id}`, `GET /v1/projects/{id}/assessments/latest` and each row of
  `GET /v1/projects/{id}/assessments` carry `usage` once the takeoff is complete or failed.
- **Estimates and bids.** `POST /v1/projects/{id}/estimates` (`create_estimate`) and `POST /v1/projects/{id}/bids`
  (`create_bid`) answer with `usage` for the call's own AI work. They wait for the charge to settle before they
  answer, so `usage` is in the reply.

It looks the same everywhere:

```json
{
  "usage": { "credits": 14.62, "amount": 13.16, "currency": "EUR" }
}
```

- `credits`: the AI usage in credits.
- `amount`: what it cost in the company's billing currency, rounded to the cent (credits times the credit price).
- `currency`: the company's billing currency (ISO 4217).

`usage` is left out while the work runs, for callers who cannot see the company's billing, and on the MCP server.

## Usage by app, key or end user

`GET /v1/usage` (`get_usage`) reads the company's AI usage in a window, grouped the way you ask:

```bash
curl "https://api.exayard.com/v1/usage?groupBy=end_user" \
  -H "Authorization: Bearer $EXAYARD_API_KEY"
```

| Parameter | Required | What it does |
| --- | --- | --- |
| `groupBy` | Yes | `app`, `key`, `end_user` (the [`Exayard-End-User`](https://developers.exayard.com/concepts/end-users.md) header) or `operation` |
| `dateFrom` | No | Start of the window, in epoch milliseconds, inclusive. Default: the start of this billing month. |
| `dateTo` | No | End of the window, in epoch milliseconds, exclusive. Default: now when `dateFrom` is given, else the end of this billing month. |
| `appId` | No | Only this app's usage |
| `appKeyId` | No | Only this key's usage |
| `endUser` | No | Only this end user's usage (1 to 128 characters) |
| `organizationId` | No | The company. Leave it out with a key set to work in **This company**. |

An example answer:

```json
{
  "currency": "USD",
  "groupBy": "end_user",
  "dateFrom": 1790812800000,
  "dateTo": 1793491200000,
  "groups": [
    { "key": "customer-4821", "label": null, "credits": 42.5, "amount": 42.5 },
    { "key": null, "label": null, "credits": 3.1, "amount": 3.1 }
  ],
  "total": { "credits": 45.6, "amount": 45.6 },
  "complete": true
}
```

- `groups`: the most first. A group that cost nothing is left out. `key` is the app id, key id, end user or operation,
  and `null` for usage that carries none (such as work done in the app with no end user). `label` is the app's or
  key's name, and `null` for end users and operations.
- `credits` and `amount`: as in the `usage` field, in the company's billing `currency`.
- `total`: the sum over the window.
- `complete`: `false` when the window held more rows than one read takes. The figures are then a floor, so ask for a
  shorter window.

It needs the `read:usage` scope. A key's app reads only its own usage: the answer is narrowed to that app, you can
still group and filter by key, end user and operation, and naming another app's `appId` gets 403 `forbidden`. An
admin's sign-in, or a key set to work in **This company** that holds `admin:org` or `*`, reads every app's usage. It is on the REST
API only, not the MCP server. `dateFrom` must be before `dateTo`.

On the **Usage** page in Exayard, **Spending by app** shows the same split: each app's keys and its top end users.

## Balance and history

- `GET /v1/credits/balance`: the company's balance.
- `GET /v1/credits/usage`: the history, newest first. Takes `limit`, `cursor`, `dateFrom`, `dateTo`, `type` and
  `kind`. See [Pagination](https://developers.exayard.com/concepts/pagination.md).
- `GET /v1/credits/stats`: totals over a date range (`dateFrom`, `dateTo`).

## Who pays

- Work in your company is paid by your company, whichever app or key started it.
- AI work in a [sandbox](https://developers.exayard.com/environments.md) costs nothing: takeoffs, file reads and other AI answers there are samples,
  marked `"sample": true`. A sandbox follows the plan of the company it belongs to.
- Work in an [account for your customer](https://developers.exayard.com/concepts/customer-accounts.md) is paid by your company.
- Work your app does in a company that installed it is paid by that company. Its admin can set a monthly AI limit
  for your app.
