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

  1. First token: 500 free credits are granted once, when you create your very first token.
  2. 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.
  3. Buying credits: one-off packs are credited as soon as the Stripe payment goes through.
  4. Subscription plans: monthly credits are added when Stripe's invoice.payment_succeeded event arrives — not when checkout completes.
  5. 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 found
  • GET /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 endpointCredits
search_property_transactions / GET /v1/transactions5 cr.
analyze_market_statistics / GET /v1/stats/market5 cr.
GET /v1/transactions/:id2 cr.
GET /v1/businesses/:siren2 cr.
search_real_estate_businesses / GET /v1/businesses/search5 cr.
get_building_characteristics / GET /v1/transactions/:id/bdnb2 cr.
GET /v1/transactions/:id/dpe2 cr.
GET /v1/bdnb/stats5 cr.
find_property_comparables / GET /v1/comparables10 cr.
estimate_property_value / GET /v1/estimate10 cr.
analyze_price_trends / GET /v1/stats/trends10 cr.
compare_locations / GET /v1/stats/compare10 cr.
analyze_market_activity / GET /v1/market-activity10 cr.
score_market_health / GET /v1/market-score10 cr.
analyze_dpe_distribution / GET /v1/dpe/stats10 cr.
analyze_dpe_price_premium / GET /v1/stats/dpe-premium10 cr.
analyze_dpe_price_and_thermal_risk / GET /v1/stats/dpe-premium10 cr.
GET /v1/dpe/passoires-thermiques10 cr.
GET /v1/dpe/evolution-prime-verte10 cr.
analyze_building_age_price_impact / GET /v1/bdnb/age-stats10 cr.
score_renovation_potential / GET /v1/bdnb/renovation-score10 cr.
get_zonal_price_distribution / GET /v1/heatmap15 cr.
lookup_property_history / GET /v1/property-history20 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_propertyfree
create_market_alert / list_market_alerts / update_market_alert / delete_market_alertfree
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.).