ProductVera
Security AI that checks its own work.
Our checks flag the places in your code that could let the wrong person in. Vera reads each flag against the exact rule it touches and takes out the false alarms it can rule out.
1export async function DELETE(req: Request, { params }: Ctx) {2const session = await auth()3if (!session) return new Response(null, { status: 401 })4await db.order.delete({ where: { id: params.id } })First readerFast modelConfirmedIt deletes whatever order the request names. Nothing ties it to the signed-in user.Second readerStronger modelConfirmedAny signed-in user can delete any order by its id.5return new Response(null, { status: 204 })6}
Examples, not a customer’s code.
It knows what counts as a problem.
Every check comes with a written rule: what is a problem, and what is not. Vera holds the code up against it.
export async function DELETE(req: Request, { params }: Ctx) {const session = await auth()if (!session) return new Response(null, { status: 401 })await db.order.delete({ where: { id: params.id } })return new Response(null, { status: 204 })}
Anyone signed in can delete any order.
export async function GET(req: Request, { params }: Ctx) {const session = await auth()const order = await db.order.findFirst({where: { id: params.id, userId: session.user.id },})return Response.json(order)}
It only finds orders of the signed-in user.
- Confirmed
- Rejected
- Cannot tell
Read the rule, word for word
- A problem
- A signed-in user can read (and receive) or change/delete a record chosen by an id/slug in the request, and nothing ensures the record belongs to them or their team, and no admin/role check applies.
- Not a problem
- The query filter includes the session user, team, workspace, organisation or project the caller belongs to; the record is loaded and the code stops when it does not belong to the caller; …
What it rules out never reaches you.
What both readers confirm, or can’t settle, lands in your report. The rest you never see.
In your report4
DELETE /api/orders/[id]Both readers confirmed itHighPATCH /api/projects/[id]Neither reader could settle it, so it staysHighPUT /api/teams/[id]Both readers confirmed itHighDELETE /api/comments/[id]The readers disagreed, so it staysHigh
Left out4
GET /api/orders/[id]The first reader ruled it outGET /api/invoices/[id]The first reader ruled it outGET /api/files/[id]The first reader ruled it outGET /api/meThe first reader ruled it out
These are example flags, not a customer’s.
Found by Vera. Fixed by our team.
Once a problem is confirmed, our team fixes it for your app. Then the same check runs again to prove it’s gone, before anything reaches your code.
await db.order.delete({ where: { id: params.id } })await db.order.deleteMany({where: { id: params.id, userId: session.user.id },})
- Our team wrote the change
- The check that found it ran again and no longer finds it
- Ready to merge
Tested on code it has never seen.
People who had never seen our checker wrote the test code. We also ran it on real open-source codebases.
- 0real problems lost
- 6false alarms caught
- 87%92%of the flags were real problems
- 560test cases
The first three numbers come from the two held-out test sets. On real codebases more flags turn out wrong, mostly in old files that are no longer deployed, and the review once set aside a real problem. The study and the coverage page show how we measured. Read the study
It looks where your app points.
Now and then, Vera reads what the daily check saw and picks up to six places worth a closer look, from a fixed list of nine. Our own checker makes those requests. It only reads, and it keeps names and counts, never values.
What Vera reads
- A Next.js app
- The scripts and the /api routes they mention
- What the last check found
It never sees your address or your company’s name.
Where it looks4 / 9
- A source map is published
GET /_next/static/chunks/main.js.mapThe scripts point to their source maps.A source map at this path names 212 original files. - An API description is published
GET /api/docsA script fetches /api/docs.The path did not serve an API document. - An API route answers with records to anyone
GET /api/ordersThe scripts call /api/orders before sign-in.The route does not answer without a session. - An environment file is published
GET /.envThe last check found a public backup folder.No environment file at that path.
An example run. What it finds is filed without your app’s name and reaches you as a finding once a fix exists. Only apps with a confirmed domain take part, and you can leave the sample in your app’s settings.
It also checks the AI inside your app.
If your app runs on AI, three checks look at what could go wrong with it.
- Who can spend your AI budgetHighAnyone can use your AI features on your bill when nothing asks them to sign in or slows them down.Read the check
- What your AI tools let a prompt doHighA sentence planted in a document your AI reads can steer its tools.Read the check
- Where your app inserts raw HTMLHighAn AI answer shown as HTML can run code in every visitor’s browser.Read the check
See what your app shows to anyone.
Start with a free check. You don’t even need an account to see your score.