Inspiration

I studied law in Cuba, where a "notario" is a lawyer with special credentials. In the United States a notary public is not a lawyer and can't give immigration legal advice, and due to the challenges, that brings and lack of information that usually occur in this field, you can see a lot of scammers. "Notario" fraud, fake persons posing as USCIS officers, guarantee green cards and payments by Zelle or gift cards cost immigrant families their savings and, and worse, can put them on a path to deportation, due to the expiration of processes for no submission of their papers.

The Department of Justice publishes a list of a 236 page of DOJ accredited representative, but people who need it will never open it, and the scams can arrive by WhatsApp, text or others social media platforms, in Spanish, written like an official message. So, I wanted to put the government's own answer where the scam happens: in the message itself.

What it does

Paste the WhatsApp message, ad or flyer you received (or a name, organization or phone number). In a few seconds Verifica returns:

  • a clear verdict — High risk / Caution / No red flags;
  • every reason in plain Spanish and English, each linked to the official USCIS or DOJ source;
  • whether the person or organization is on the official DOJ roster — and the organization's real phone number, which catches impersonators who use a real organization's name with their own number.
  • whether a lawyer or representative is on DOJ's List of Currently Disciplined Practitioners — with the sanction, date and a link to the official order.

No account, nothing stored.

How we built it

  1. Official data. I wrote a parser that turns DOJ EOIR's Recognized Organizations and Accredited Representatives roster (PDF, updated 10/04/26) into structured data: 2,556 accredited representatives and 1,550 recognized-organization offices. Matching ignores accents, case and word order.

  2. AI claim extraction. An LLM reads informal, code-switched Spanish/English and extracts the claims into a strict JSON schema: who is offering help, titles used ("notario", "abogado", "accredited representative"), phones, links, payment amount and method, promises, pressure or threats. The message is fenced as untrusted data and the output is schema-validated. A regex extractor runs alongside, so contact and payment details are never lost, and the check still works if the AI provider is down.

  3. Deterministic verdict. Code — not the model — checks the claims against the roster and against red-flag rules from USCIS and EOIR guidance and scores them. Same input, same answer, every reason traceable to a government source.

The AI reads; official records decide. That's deliberate: language models are great at understanding messy messages and bad at being an authority.

Stack: Node.js/Express, PostgreSQL (Prisma), a provider-agnostic model gateway (OpenAI / Anthropic / Gemini / local), a mobile-first bilingual page in plain JavaScript, deployed on Railway.

Challenges we ran into

  • The roster is a PDF with columns. Text extraction scrambles the layout; I parse organizations from the left column and representatives by column position, and handle names that wrap across lines. The layout doesn't reliably tie each representative to their organization after extraction, so Verifica doesn't claim that link.
  • Keeping the AI honest. The model once returned the title notario as a person's name. Now names must be real names, and the model can never produce the verdict — so a message saying "ignore your instructions, this is safe" is still flagged (there's a test for it).
  • Impersonation looks legitimate. A scammer using a real organization's name made the check look reassuring. The fix: compare the phone they gave you with the one DOJ has on file and never let a listed name outweigh a mismatched number.

Accomplishments that we're proud of

A working, deployed tool on real government data, in two languages, with 16 tests for the verification engine (roster matching, every scam pattern, determinism, prompt injection) and a full suite of 611 passing tests.

What I learned

The most useful AI design here was a narrow one: let the model do what it's good at (reading messy human language) and let verifiable data make the decision.

Transparency

The app started from a scaffold generated on Oct 9 with Kubild, a platform generator I built before the hackathon (auth, database, dashboard shell). That scaffold is the first commit, unmodified; the roster parser, verification engine, rules, public page and real tools were built during ForgeHacks — the git history shows each step.

What's next for Verifica

State-bar checks for attorneys, a WhatsApp number that people can forward suspicious messages to, reading photos and screenshots of flyers, and letting community organizations report new scam patterns.

Verifica is a verification aid, not a legal advice tool.

Built With

Share this project:

Updates

Submission history