# Vendor billing verification (/docs/concepts/billing-verification)



When you call with your own vendor key, the vendor bills you directly. GridRouter reads what the
vendor reported for each call (from its response headers or body), works out what its published
pricing rules say it should have charged, and records a verdict on the call's log row.

## Verdicts [#verdicts]

| Verdict                | When                                                                          |
| ---------------------- | ----------------------------------------------------------------------------- |
| `ok`                   | The vendor reported exactly the expected charge                               |
| `charged_for_miss`     | It charged more than expected, and the call was a miss or failed              |
| `double_charged_retry` | It charged again for a request it had already billed within its repeat window |
| `price_mismatch`       | It charged less than expected, or more on a hit or record count               |
| `unverifiable`         | There is no rule for the endpoint, or the vendor reported nothing             |
| `none`                 | The vendor was not called (for example, a private-cache hit)                  |

Search `billing:mismatch` in `/logs` for all three mismatch verdicts, or name one:
`billing:charged_for_miss`, `-billing:ok`.

## Rules [#rules]

Each rule comes from the vendor's own pricing page and is linked from the call's detail sheet. A rule
says when the vendor charges (`always`, on any 2xx `success`, only on a `hit`, `per_record`, or
whatever the body states `per_credit`), how many credits, when a charge is waived, and whether
retries and repeats of an already-billed request are billed again.

| Vendor                             | Coverage                                                                                                                  |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Vendors that report usage per call | Rules for every endpoint; each call is checked against the credits the vendor reports                                     |
| Hunter                             | Rules exist, but Hunter reports no per-call usage, so calls read `unverifiable`                                           |
| Prospeo                            | `email.find` (free on a record already bought, repeats within 90 days free); no public price, so dollar amounts are empty |
| Everyone else                      | `unverifiable` until their rules are researched and cited                                                                 |

For example, Prospeo's `email.find` costs 1 credit only when it returns an email, and nothing when
the same record is enriched again within 90 days. A miss that consumed a credit reads
`charged_for_miss`.

## Where it shows [#where-it-shows]

* The **Billing** column and facet in `/logs`, and a Billing section in each call's detail sheet:
  the rule in plain English with its source, the expected and reported credits and dollars, and the
  balance the vendor reported.
* **Billing accuracy** in the log toolbar: per vendor, calls checked, billed right, each mismatch
  type, and credits and dollars overbilled for the current filters. The API is
  [`GET /v1/logs/billing`](/docs/api/logs/logs_billing).
* **Export → Billing disputes (CSV)**: the mismatches only, with request id, UTC timestamp, vendor,
  endpoint, verdict, outcome, HTTP status, expected and reported credits and USD, balance after, and
  the rule. Send it to the vendor as-is.

Calls on GridRouter's managed vendor accounts read `managed`; their vendor-side cost is never shown.

