Skip to content

Billing & Refunds

Realtime billing is per product, per identifier. A call reserves money up front, then settles once every selected product has an outcome.

When a call is accepted, the platform reserves the sum of the per-check prices of the selected products. Nothing is charged yet. As results come back, each entry settles on its own:

  • a charged entry keeps its reservation
  • a refunded entry returns it to your balance

The three totals in the response describe that settlement:

FieldMeaning
total_reservedReserved when the call was accepted
total_chargedActually kept
total_refundedReturned to your balance

They always balance: total_reserved = total_charged + total_refunded.

Outcomebilling_statusWhy
valid — the identifier is registeredchargedA real answer was produced
invalid — the identifier is not registeredchargedA real answer was produced
unknown — the supplier returned nothing conclusiverefundedNo answer; an inconclusive result is never billed
Provider timeoutrefundederror_code: provider_timeout
Channel or user slot unavailablerefundederror_code: channel_busy / user_busy
Concurrency protection on a shared factrefundederror_code: fact_refresh_busy
Supplier failed the checkrefundederror_code: realtime_failed
Result cache unavailablerefundederror_code: fact_cache_unavailable

A cache hit is still charged. A cached: true entry is a real answer that was produced by an earlier check and stored; the charge reflects the answer, not the round trip. Only unknown and failed outcomes are refunded.

Since every entry settles separately, one call can hold both outcomes. That is reported as status: partial_succeeded — HTTP is still 200. Never treat a 200 as “everything worked”:

  1. read status
  2. for each entry, read billing_status and error_code

status values: succeeded (every entry charged), partial_succeeded (a mix), failed (no entry produced a chargeable answer).

Calls require enough balance for the full reservation. If it is short, the call fails with 402 insufficient_balance before any product is contacted — nothing is reserved, nothing is charged.

The balance itself is available from GET /v1/balance. See Account balance.

There is no refund request step. A refunded entry is settled back to your balance as part of the same call, and the response you receive already reflects the final numbers.