Use case
Regulatory and compliance research
Teams in finance, legal, pharma and the public sector who must defend a retrieval decision.
The problem, and the approach
The problem
- The question after an answer is not "what did you find" but "what did you miss, and can you show it was not material".
- No amount of ranking quality answers that, because ranking says nothing about what was excluded.
- Reproducing a retrieval decision months later requires knowing what the index held at the time, not what it holds now.
The approach
- from and to bound the crawl-time window, reconstructing the evidence base as it stood at a point in time.
- authority restricted to governmental and educational sources removes an entire category of noise in one parameter.
- why_not explains any specific exclusion — present, removed with a typed reason and replacement, or never admitted.
- assemble_context attaches a reason to every included passage, making the selection itself auditable.
The parameters that matter
| Parameter | Value | Why |
|---|---|---|
from / to | the period under review | Reconstructs the evidence base at that time. |
authority[] | gov, edu | Institutional sources only. |
min_independent_sources | 2 | A documented threshold applied uniformly. |
why_not?url= | any challenged document | A substantive answer to "why was this not in scope". |
curl -H "x-api-key: $UNLOB_API_KEY" \
"https://api.unlob.com/search?q=disclosure+requirement&authority[]=gov&from=1735689600&to=1738368000"
curl -H "x-api-key: $UNLOB_API_KEY" \
"https://api.unlob.com/why_not?url=https://example.gov/guidance/2026-04"Defensibility is about the exclusions, not the hits
In regulated work nobody doubts that a search happened. The question asked afterwards is what it missed, and that is a question about the excluded set — which most retrieval stacks cannot describe at all, because exclusion happens implicitly through ranking and the cut-off at k.
Making the exclusions explicit is what turns a search into a record. A uniform corroboration threshold, an authority filter and a bounded time window are all statements about what was not considered, applied identically to every query in a review rather than tuned per question. The uniformity is the part that matters: a threshold varied by hand across a review produces a set of results nobody can characterise afterwards, which is worse than a stricter threshold applied consistently.
An answer about absence, and its boundary
The strongest thing this workload gets is a substantive answer about a URL that did not appear: present, removed with a stated reason and a timestamp, or never admitted. Against an append-only ledger that is a reconstructable claim rather than an assurance, and it is the difference between “we searched the web” and a description of what was considered and what was set aside.
Two boundaries should be stated to whoever relies on it. History windows are bounded by plan, so a review that needs to reach back years has to be on a plan that reaches back years — discovering that mid-review is expensive. And a technical answer about index membership is not a legal one: whether it satisfies a particular obligation is a question for your compliance function, and the honest position is to hand them the mechanism rather than a conclusion.
What a fair test looks like
A representative task: Establish the current position on a regulatory question from official sources. Take twenty of yours, write down what a good result is before running anything, and score them on:
- Official or primary sources are present for every conclusion.
- The evidence base can be reconstructed as of a past date.
- An expected document that is missing is explained, not silently skipped.
Include tasks where the right answer is to abstain, and report the cases where unlob does not fit alongside the ones where it does. How an evaluation works.
What it costs
The recipe above, as an illustrative call pattern: 2 search + 1 assemble_context + 1 why_notper regulatory question — 6 credits. Two searches restricted to official sources, a reading set, and a why_not on the document the answer expected to find.
| Tasks a month | Credits | Cheapest plan | Per 1,000 tasks |
|---|---|---|---|
| 1,000 | 6,000 | Build, $29/mo | $29 |
| 10,000 | 60,000 | Build, $39/mo with overage | $3.90 |
| 100,000 | 600,000 | Scale, $259/mo with overage | $2.59 |
Provider spend only; your model and review effort are separate lines. The pattern is a starting point, not a measurement — cost your own.
Where this is not the right tool
- History windows are plan-bounded: 30 days on Free, one year on Build, five years on Scale, and the full index on Archive.
- why_not is a substantive answer, not legal advice. Whether it satisfies a specific obligation is a question for your compliance function.
- Query strings leave your infrastructure. Treat the query itself as disclosed.
Frequently asked questions
Can I reproduce a search from six months ago?
You can reconstruct the evidence base by bounding the crawl-time window, provided your plan reaches that far back. Ranking may differ as the index evolves, so log the returned passage ids at the time.
What should I log for an audit trail?
The query and every filter verbatim, the timestamp bounds, the corroboration threshold, the passage ids returned with their reasons, and the result of any why_not call about a document later raised.
Evaluate it on twenty of your tasks
Send the tasks and what a good result looks like, and we report what was found, what was missing, the cost and where unlob does not fit — or run it yourself on 10,000 free credits a month.