# When a live HLR dip is worth five credits

_2026-09-17 · Boundstone (https://boundstone.io/blog/when-to-pay-for-hlr)_


There are two different questions you can ask about a phone number, and they have different prices.

The first is whether the number *could* ring: is it well-formed, does it sit in an allocated range, and what is that range designated for. That is metadata, it is fast, and on Boundstone it costs one credit.

The second is whether it *does*: who carries it right now, whether it has been ported away from its original network, and whether the network says it is currently reachable. That requires asking the network, and it costs five credits.

Most rows do not need the second question. Knowing which ones do is the whole skill.

## What the dip actually returns

Send `hlr:true` on a paid plan and Boundstone queries the Home Location Register — the mobile network's own record of the subscriber. The response gains:

- **`current_carrier`** — who serves the number today, which is not necessarily who was allocated the range.
- **`ported`** — whether it has moved networks.
- **`reachable`** — `true` only when the network answered CONNECTED. Anything less determinate comes back `null` rather than being rounded to a verdict.
- **`roaming`** — whether the handset is currently on another network.

And the arrays change. `carrier_lookup`, `ported_status` and `hlr_liveness` move out of `checks.not_performed` and into `checks.performed`, because they genuinely ran. That movement is the point: you can tell from the payload alone which question was answered.

## The refund is part of the price

Networks do not always answer. When a dip cannot be resolved, Boundstone abstains and refunds the five credits rather than returning a confident-looking `null` you have paid for.

This is worth checking with any vendor you evaluate, because it changes the real per-answer cost substantially. A provider that bills every attempt is charging you for its supplier's silence.

## Where the dip pays

The rows where five credits is a good trade share a shape: **the downstream action is expensive, irreversible, or both.**

**The ambiguous bucket.** In North America the numbering plan shares ranges, so a large share of numbers return `fixed_line_or_mobile` — an honest abstention. If you were going to guess, a dip replaces the guess with the network's answer.

**Before a paid send at volume.** If a message costs you money per recipient, spending five credits to avoid spending it on an unreachable handset is straightforward arithmetic with your own numbers.

**Aged lists.** Metadata does not decay, which is exactly the problem. A number allocated to a mobile range five years ago still reads `mobile` today whether or not anyone has it. Porting and disconnection are invisible to a metadata check by construction.

**High-value, low-volume rows.** When the list is small and each contact matters, the marginal cost of certainty is trivial.

## Where it does not

**Fresh lists with clean metadata.** If a number is well-formed, unambiguously `mobile`, and collected last week, the dip usually confirms what you already believed.

**Rows you are about to drop anyway.** Dip after filtering, never before. Paying to learn that an invalid number is also unreachable is paying twice for the same decision.

**Free-tier work.** HLR is a paid-plan feature. On the free tier the base checks run and the response marks the live layer `not_performed` — honestly, and without a paywall message dressed up as a result.

**Compliance questions.** A dip tells you the network's view of a number. It does not tell you whether you are permitted to contact it. DNC scrubbing and consent remain separate steps with separate tools, and none of this is legal advice.

## The workflow that usually wins

1. Screen the whole file on metadata with `POST /v1/bulk/phone` — one credit per row, refunded on any row that errors.
2. Drop everything where `valid` is not `true`.
3. Segment on `line_type`.
4. Dip only the segment where a wrong answer costs you something — typically the ambiguous bucket and anything you are about to pay to reach.

That shape spends five credits where they change a decision and one credit everywhere else.

## The short version

- **Two questions, two prices.** Metadata asks whether a number could ring; an HLR dip asks whether it does.
- **The payload shows which you bought.** `carrier_lookup`, `ported_status` and `hlr_liveness` move into `checks.performed` only when the dip actually ran.
- **`reachable` is `true` only on a CONNECTED answer.** Anything less determinate returns `null` rather than a rounded verdict.
- **Abstentions are refunded.** Five credits buys an answer, not an attempt — worth checking with every vendor you compare.
- **Dip the segment, not the list.** Filter, segment, then spend where being wrong is expensive.
- **It is not a compliance layer.** DNC and consent are separate steps, and this is not legal advice.
