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.
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. 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/latestand each row ofGET /v1/projects/{id}/assessmentscarryusageonce the takeoff is complete or failed. - Estimates and bids.
POST /v1/projects/{id}/estimates(create_estimate) andPOST /v1/projects/{id}/bids(create_bid) answer withusagefor the call's own AI work. They wait for the charge to settle before they answer, sousageis in the reply.
It looks the same everywhere:
{
"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:
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 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:
{
"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.keyis the app id, key id, end user or operation, andnullfor usage that carries none (such as work done in the app with no end user).labelis the app's or key's name, andnullfor end users and operations.creditsandamount: as in theusagefield, in the company's billingcurrency.total: the sum over the window.complete:falsewhen 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. Takeslimit,cursor,dateFrom,dateTo,typeandkind. See Pagination.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 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 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.