Documentation / Concepts / Credits
Credits & billing
Credits are the API's unit of usage. Each call costs a fixed number of credits, deducted before the request runs.
Credit lifecycle
- First token: 500 free credits are granted once, when you create your very first token.
- Monthly top-up (free plan): on the 1st of each month at midnight UTC, the free portion of every active free-plan token is reset to 500. Unused free credits don't carry over; purchased credits are untouched.
- Buying credits: one-off packs are credited as soon as the Stripe payment goes through.
- Subscription plans: monthly credits are added when Stripe's
invoice.payment_succeededevent arrives — not when checkout completes. - Token rotation: creating a new token revokes the old one and transfers the existing balance. You don't get a new batch of 500 credits.
Deducted before execution
Credits are deducted before each request runs. If your balance is too low, the request is blocked with HTTP 402 (REST) or an error message in content[0].text (MCP).
Check your balance first
On expensive calls (20 credits for
lookup_property_history), make sure your balance is enough before chaining several requests. The _credits.remaining field is included in every successful response.Automatic refund
If a request fails after the deduction (database error, timeout, 404), the credits are refunded automatically. Refunded cases:
- Timeout or unexpected SQL error
GET /v1/transactions/:id— 404 transaction not foundGET /v1/businesses/:siren— 404 SIRET not found
Low-balance indicator
When your balance drops below 20 credits, a note field appears in _credits:
"_credits": {
"used": 5,
"remaining": 12,
"note": "Low credits! Recharge at normi.fr/dashboard/credits"
}Strict monthly cap
From the API tokens page, you can set a monthly credit cap on your active key. Unlike a low-balance alert, this cap blocks the call before it runs and before anything is charged. It covers MCP calls, REST calls and Normi Pro report overages that use this key.
- The counter follows UTC calendar months and resets on the 1st at 00:00 UTC.
- The cap can be changed or turned off at any time from the dashboard.
- Token rotation keeps the cap and the current month's usage.
- A request that fails after reservation is refunded and doesn't count towards the cap.
Cap errors
REST answers
402 spend_cap_exceeded with the next reset time. MCP returns a result with isError: true and the same reason in content[0].text. Top up your credits or raise the cap, depending on your usage policy.Cost per tool
| MCP tool / REST endpoint | Credits |
|---|---|
search_property_transactions / GET /v1/transactions | 5 cr. |
analyze_market_statistics / GET /v1/stats/market | 5 cr. |
GET /v1/transactions/:id | 2 cr. |
GET /v1/businesses/:siren | 2 cr. |
search_real_estate_businesses / GET /v1/businesses/search | 5 cr. |
get_building_characteristics / GET /v1/transactions/:id/bdnb | 2 cr. |
GET /v1/transactions/:id/dpe | 2 cr. |
GET /v1/bdnb/stats | 5 cr. |
find_property_comparables / GET /v1/comparables | 10 cr. |
estimate_property_value / GET /v1/estimate | 10 cr. |
analyze_price_trends / GET /v1/stats/trends | 10 cr. |
compare_locations / GET /v1/stats/compare | 10 cr. |
analyze_market_activity / GET /v1/market-activity | 10 cr. |
score_market_health / GET /v1/market-score | 10 cr. |
analyze_dpe_distribution / GET /v1/dpe/stats | 10 cr. |
analyze_dpe_price_premium / GET /v1/stats/dpe-premium | 10 cr. |
analyze_dpe_price_and_thermal_risk / GET /v1/stats/dpe-premium | 10 cr. |
GET /v1/dpe/passoires-thermiques | 10 cr. |
GET /v1/dpe/evolution-prime-verte | 10 cr. |
analyze_building_age_price_impact / GET /v1/bdnb/age-stats | 10 cr. |
score_renovation_potential / GET /v1/bdnb/renovation-score | 10 cr. |
get_zonal_price_distribution / GET /v1/heatmap | 15 cr. |
lookup_property_history / GET /v1/property-history | 20 cr. |
add_property_to_portfolio (house/apartment) | 10 cr. |
add_property_to_portfolio (other type) | 2 cr. |
list_portfolio_properties / get_portfolio_property / update_portfolio_property / delete_portfolio_property | free |
create_market_alert / list_market_alerts / update_market_alert / delete_market_alert | free |
Keeping consumption down
Use
summary_only=true on search_property_transactions to save context space (the credit cost stays the same). Chain MCP calls sensibly: an analyze_market_statistics call (5 cr.) before a find_property_comparables (10 cr.) often saves you calling lookup_property_history (20 cr.).