What it is
NusaVerify checks investment information before you act on it. You paste a claim – "this robot trading guarantees 20% a week", "BBCA is about to announce a jumbo dividend", an Instagram post from a stock influencer, a screenshot from a Telegram "cuan" group – and six AI agents search the stock exchange (BEI), the financial regulator (OJK), the financial press and retail sentiment at the same time. You get back a verdict – verified, misinformation or unconfirmed – with a confidence score, a plain-language explanation, and a live knowledge graph of every source that moved the number.
The problem
Indonesia's new retail investors learn about markets from Instagram, TikTok and Telegram groups, which is exactly where pump-and-dump calls, fake corporate actions and illegal investment schemes spread. The information needed to check them already exists – exchange disclosures, OJK's list of illegal entities, the financial press – but it is scattered across sites a beginner does not know to open, and a rumour moves faster than anyone can read all of them.
Chapter 01
From fact-checking to the place misinformation costs money
The first version was a general-purpose hoax detector: politics, science, the claims that fill a family WhatsApp group. It worked, but it competed with every fact-checking site in the country, and the cost of believing a wrong claim was abstract.
For the Bank Indonesia hackathon I narrowed it to investment information – stocks, crypto, forex, gold and macro – where a believed rumour has a price tag. Every source, every agent persona and every verdict label was rewritten for that domain: "hoax" became "misinformation", and "uncertain" became "unconfirmed – be careful".
“Check first, then believe.”
Chapter 02
Six agents, scored separately
One model asked whether a claim is true is confidently wrong in exactly the cases that matter. So the work is split: an agent for the exchange and the regulator, agents for CNBC Indonesia, Kontan and Bisnis Indonesia, one reading retail sentiment, and a market analyst that pulls the findings together. Each one scores the claim on its own scale from supporting to refuting.
Keeping them separate is what makes the result honest. When retail sentiment is full of "already withdrawn my profit" testimonials while OJK has the entity on its illegal list, that disagreement is the most useful thing to show – and it would disappear if everything were averaged into one sentence.
Chapter 03
Making the reasoning watchable
A check takes long enough that a spinner would lose the user. Instead, every agent writes its intermediate findings into Supabase as it goes, and the page polls that trace: the knowledge graph grows node by node while the sources are being explored, collapses into an agent-to-agent conversation during cross-analysis, and resolves into the verdict card when the run completes.
That turned the waiting time into the explanation. By the time the verdict appears, the user has already watched which sources supported it and which did not.
Key decisions
05Go for the agent orchestration layer
A check is six agents waiting on network calls at the same time. Goroutines make that fan-out cheap and explicit, and a single compiled service is easy to deploy next to the workflow engine.
Trade-off · A thinner AI ecosystem than Python, so prompt handling and agent plumbing are written by hand.
n8n for intake and integrations, code for the reasoning
Receiving a claim, normalising text, images and links, and calling external services is integration work that changes often – a visual workflow makes it fast to rewire during a hackathon. The part that has to be precise, the agents and their scoring, stays in Go.
Trade-off · Logic lives in two places, so a bug can sit on either side of the webhook boundary.
Meta Graph API (GraphQL) to read Instagram posts
Much of the misinformation arrives as an Instagram post, not as text. Pulling the caption and media through Meta's official Graph API means the agents check what the post actually says rather than whatever the user managed to copy.
Trade-off · Access depends on Meta Business app permissions and review, which is a dependency outside the codebase.
Supabase as the shared trace, polled by the browser
Agents write intermediate state – exploring, analyzing, completed – into a `think` table. The front end only has to read it, which keeps the Next.js app thin and lets anyone reopen a running check from its URL.
Trade-off · Polling every few seconds is less elegant than a push channel, and the table schema is tied to the current set of sources.
A signed confidence score, not a percentage of truth
Confidence runs from -100 (leans misinformation) to +100 (leans verified). The sign carries the direction and the magnitude carries how sure the agents are, so "uncertain but leaning hoax" can be shown instead of forced into a binary.
Trade-off · One more concept the interface has to teach in a single glance.
Results
- Live at nusaverify-web.vercel.app, covering stocks, crypto, forex, gold and macro claims.
- Accepts plain text, Instagram links and screenshots, with an optional ticker such as $BBCA or BTC.
- Six agents run in parallel across BEI/OJK, CNBC Indonesia, Kontan, Bisnis Indonesia, retail sentiment and a market analyst.
- Every check produces an inspectable trace: an interactive knowledge graph, the agents' cross-analysis and a verdict with source links.
- Clearly framed as information validation, not investment advice.
Looking back
Narrowing the domain did more for the product than any model change. Once the claims were about money, the sources became obvious, the verdict labels became sharper, and the reasoning trace stopped being decoration – an investor deciding whether to buy needs to see why. If I rebuilt it, I would make the source list dynamic from the start instead of one column per outlet, so adding a new regulator or exchange is data, not a migration.
