What research agents buy
A research agent answers a question by finding sources — and good sources increasingly cost money. Market reports, industry datasets, paywalled articles, API access to financial or company data, transcripts, survey panels. Each purchase is small; together they are a real budget, spread across dozens of vendors the agent found on its own.
That shape — many small purchases from an open set of vendors — is exactly where fixed vendor lists stop working and spend authority has to carry the judgment.
The real risk: drift
Research agents rarely overspend in one go. They drift. The question was the European market for payments infrastructure; three steps later the agent is buying a consumer survey because a search result looked relevant, or a dataset about a neighbouring market because the vendor ranked first. Every purchase is cheap, plausible and slightly off-topic.
Budgets bound how much drift costs. Only a purpose check can notice that it is happening — by comparing each purchase with the question the budget was given for.
An authority for a research agent
{
"purpose": {
"objective": "Size the European market for payments infrastructure",
"success_criteria": [
"Sources cover European payments infrastructure",
"Every purchased source is cited in the weekly research report"
],
"constraints": [
"No personal consumer data",
"No sources about unrelated markets"
],
"context": "Strategy team, weekly market-sizing report"
},
"currency": "EUR",
"per_transaction_limit_minor": 30000,
"review_threshold_minor": 15000,
"monthly_budget_minor": 200000,
"velocity": {
"max_count": 10,
"window_seconds": 3600
}
}- A purpose that states the question. The objective is the research question itself; the success criteria say what a useful source looks like; the constraints say what the budget must never buy.
- A low review threshold. Most sources cost tens of euros. At €150 a person looks — the difference between a report and a full dataset licence.
- Velocity. Ten purchases an hour is generous for real research and far too few for a loop.
- No merchant allowlist, deliberately. The value of a research agent is finding sources you didn’t know. An allowlist would remove that; the purpose check and the thresholds replace it.
Three purchases
On the question
A market-sizing report about exactly the market in the objective:
curl -X POST https://api.neltava.com/v1/decisions \
-H "x-api-key: $NELTAVA_AGENT_KEY" \
-H "idempotency-key: run-7-step-3" \
-H "content-type: application/json" \
-d '{
"task": "Weekly report: European payments infrastructure market size",
"action": {
"type": "purchase",
"merchant": "MarketLens",
"amount_minor": 9900,
"currency": "EUR",
"description": "Report: European payments infrastructure market sizing, 2026 edition"
}
}'ALLOW — within every limit and aligned with the question. It happens without anyone noticing, which is the point.
Off the question
A cheap dataset the agent found along the way:
{
"decision_id": "dec_7f3c…",
"decision": "REVIEW",
"effective_decision": "REVIEW",
"reason_code": "PURPOSE_MISALIGNED",
"requested_amount_minor": 4900,
"authorized_amount_minor": null,
"currency": "EUR",
"mode": "ENFORCE",
"explanation": "Within every limit, but the spend is assessed as not serving the delegated purpose; a person decides."
}€49 is nothing to a budget, and no rule would stop it. The purpose check sees that a dataset about sneaker popularity among teenagers doesn’t serve a question about European payments infrastructure — and asks a person rather than refusing it outright. A reviewer can still allow it, with a reason, if there is one.
On the question, but big
The full country-by-country dataset from the same vendor:
{
"decision_id": "dec_7f3c…",
"decision": "REVIEW",
"effective_decision": "REVIEW",
"reason_code": "REVIEW_THRESHOLD_EXCEEDED",
"requested_amount_minor": 24000,
"authorized_amount_minor": null,
"currency": "EUR",
"mode": "ENFORCE",
"explanation": "240.00 EUR is above the agent's autonomous approval threshold; a person decides."
}Aligned, but €240 is above the €150 threshold: a person decides whether the report is enough or the dataset is needed. That is the kind of question a research lead should answer anyway.
Why the trace matters here
Research purchases are hard to judge in isolation. “€49 dataset” means little; “searched for European payment volumes, compared three providers, picked the one with country-level data” means a lot. When the agent sends its task and the steps that led to a purchase, the purpose check asks whether that path actually ends in this purchase — and the reviewer sees the same path.
Personal data and constraints
Research budgets can buy things an organization must not hold: lists of people, scraped profiles, personal consumer data. Write those out as constraints in the purpose — “no personal consumer data” — so a purchase that conflicts with them is sent to a person. And where a category of seller must never be paid at all, block it with a rule: rules are the only thing that refuses outright.
Rolling it out
- Connect the agent in Shadow Mode, with its task and steps attached to each request.
- Label a few dozen of its purchases: did this source serve the question? Those labels measure the purpose check against your own judgment.
- Set the threshold from what you see — most research budgets need one clear line between a source and a licence.
- Switch to Enforce once the readiness criteria are met.




