Skip to content
validAItJoin early access

Real-time watch layer

Your database is already a message stream. Give it judgment.

validAIt reads each new row through the trigger your database already has, asks Jev a few typed questions about it and writes the answers back as flags. Under half a second per decision, fractions of a cent per message. No chat SDK to adopt, and nothing is deleted unless you turn that on.

Connectors run inside your own Firebase, Supabase, Appwrite, Convex, Atlas or PocketBase project. Your TypeSafe key stays in your environment. validAIt hosts the control plane: policies, thresholds, the review queue and alerts.

Free during early access. No card, no chat migration.

decision streamDemo data
  • u_4821

    Cheaper if we skip the app, WhatsApp me at +34 6xx xxx xxx

    asking Jev ...

Fictional messages. Decisions appear after a simulated round trip of 70 to 500 ms.

The problem

Watching user content means giving something up

Small teams ship chat, comments and uploads on Firebase or Supabase in a weekend, then discover that every moderation option asks them to move, wait or settle for less.

Chat SDKs own your data

Moderation that ships inside a chat SDK only sees what lives inside that SDK. To use it you migrate your messages, your schema and your auth, and your product now runs on someone else's stack.

LLM moderation is slow and pricey per message

A generative model answers in seconds and bills for every token it writes. At chat volume, teams end up sampling a slice of traffic instead of looking at all of it.

Classic classifiers only know toxicity

A toxicity score is fast and cheap, and it cannot tell you whether a user is trying to move a deal off-platform, or whether a comment needs a reply from your team today.

How it works

Connect, ask, act

One policy file describes what to watch, what to ask and what to do. validAIt runs it on every row that lands.

1

Connect

Point validAIt at a collection or table through the native trigger of your platform. Map the fields it may read, for example text, authorId and roomId. Nothing else leaves your database.

2

Ask

Write your questions as yes or no, one of up to 255 options, or a score against a rubric. Several questions go out in one request, and the answers come back typed inside your schema.

3

Act

Set thresholds per question. validAIt writes flags back to the record, notifies your team and queues items for human review. Automatic deletion is off until you turn it on.

validait.policy.yaml
source: firestore
collection: rooms/{roomId}/messages
fields: [text, authorId, roomId]

ask:
  - id: off_platform
    type: noul                # yes or no with a calibrated probability
    prompt: Is this message trying to move the deal off-platform?
  - id: category
    type: choice
    options: [harassment, scam, spam, normal]
  - id: urgency
    type: score               # continuous score against a rubric
    prompt: How urgently should a human look at this, from 0 to 1?

act:
  - when: off_platform.p >= 0.85
    do: [flag, queue_for_review]
  - when: category == scam
    do: notify(slack: "#trust-and-safety")
  - when: urgency >= 0.7
    do: prioritize

Integrations

Native triggers, not another SDK

Every connector uses the mechanism your platform already gives you. Nothing moves: database, schema and auth stay where they are.

Firestore, Realtime Database and Storage

What we watch
Firestore documents, Realtime Database nodes, Storage objects
How it connects
Cloud Functions for Firebase 2nd gen: onDocumentCreated, onValueCreated and onObjectFinalized.onValueCreated comes from firebase-functions/database and onObjectFinalized from firebase-functions/storage. No Firebase Extensions involved, that service shuts down on 31 March 2027.
What you keep
Security rules, auth and schema stay as they are. The function lives in your Firebase project.
Platform documentation
functions/index.js
// npm i firebase-functions firebase-admin
const { onDocumentCreated } = require('firebase-functions/v2/firestore');
const { initializeApp } = require('firebase-admin/app');
initializeApp();

exports.validaitOnMessage = onDocumentCreated('rooms/{roomId}/messages/{msgId}', async (event) => {
  const snap = event.data;
  if (!snap) return;
  const res = await fetch('https://api.validait.dev/v1/events', {
    method: 'POST',
    headers: { 'content-type': 'application/json', authorization: `Bearer ${process.env.VALIDAIT_KEY}` },
    body: JSON.stringify({
      source: 'firestore',
      collection: 'messages',
      id: snap.id,
      fields: { text: snap.get('text'), authorId: snap.get('authorId') },
    }),
  });
  await snap.ref.update({ validait: await res.json() });
});

Use cases

Chat, comments and uploads

Marketplaces, edtech, dating apps, communities and forums put different questions to the same kind of rows.

Real-time chat

Catch the things a toxicity score cannot see, while the conversation is still open.

  • off_platform: is this message trying to move the deal off-platform? Yes or no, with a probability.
  • category: harassment, scam, spam or normal.
  • urgency: how urgently a human should look, from 0 to 1.

Comments and posts

Keep a public feed readable without a full time moderator.

  • Spam and self promotion, separated from honest criticism.
  • Brigading: several accounts arriving at one thread with one message.
  • Needs a reply from the team, plus the language of the comment for routing.

Images and mediaBeta

We describe the image with a vision model first, then Jev decides.

  • A cheap vision pass extracts labels and text from the upload.
  • Jev answers on that description, for example: does this listing photo show a phone number or external contact?
  • Jev itself is text only. The description step is what makes media possible.

Under the hood

What Jev returns, and what it costs

validAIt runs on TypeSafe Jev, a decision model that answers inside a schema instead of writing prose.

  • three primitivesYes or no with a calibrated probability (Noul), pick one of up to 255 options (Choice), a continuous score against a rubric (Score).
  • latency70 to 500 ms end to end. Extra questions in the same request add almost nothing to that.
  • price$0.042 per million input tokens, output free. Your questions count as input tokens too, so the bill follows the size of what you send. Fractions of a cent per message.
  • context64k tokens per request, 32k for the state plus the longest question, so a decision can see the thread and not just the last line.
  • no free textJev does not generate text. It returns typed answers inside your schema, so it cannot go off-schema and there is nothing to parse.
  • your thresholdsTyped answers with calibrated probabilities, so you set the threshold. Instant categorization with a confidence you can act on.
one request, three questions
{
  "state": "Hey, WhatsApp me at +34 6xx xxx xxx and we settle it there",
  "questions": [
    { "id": "off_platform", "type": "noul",
      "prompt": "Is this message trying to move the deal off-platform?" },
    { "id": "category", "type": "choice",
      "options": ["harassment", "scam", "spam", "normal"] },
    { "id": "urgency", "type": "score",
      "prompt": "How urgently should a human look at this, from 0 to 1?" }
  ]
}

Independence. Jev is a TypeSafe AI product. validAIt is the watch layer built on top, and is not affiliated with TypeSafe AI.

Trust and control

What stays in your hands

Every decision is visible, and a person can reverse any of them.

  • Nothing is deleted by default. validAIt flags fields, notifies your team and queues items for human review. Automatic deletion is opt-in, per threshold.
  • Human review queue. Everything above a threshold lands in a queue with the question, the answer and the probability that produced it, so a person decides.
  • Only mapped fields leave your database. You list the fields the connector may read. Nothing else is sent.
  • Your TypeSafe key stays in your environment. The connector is a function in your own project and the key sits in that project's secrets. Our servers hold policies, thresholds and the review queue, never the key.
  • No training on your content. TypeSafe states it does not train on customer inputs.
  • Where the model runs. TypeSafe processes model requests in the United States. Their DPA includes the EU Standard Contractual Clauses (Module 2). Read it before you map a field you consider sensitive.

Pricing

Early access, free for founding teams

Paid plans for the validAIt layer will be announced before general availability. Model spend is billed to your own TypeSafe account.

Free

Free during early access.

  • All connectors, one policy per collection.
  • Human review queue and notifications.
  • Your TypeSafe key stays in your environment, model spend stays on your account.
  • We help you write your first policy.

Join early access

Tell us where your messages live. We reply with a connector and a policy to try on your own data.

We use your email to answer you about early access. Nothing else.

FAQ

Questions we get first

Do I have to change my chat or my database?

No. validAIt reads through the native trigger of the platform you already run, and writes its decisions back into your own records. There is no validAIt SDK in your client and no migration of your messages.

What happens when Jev gets a call wrong?

You get typed answers with calibrated probabilities, so you set the threshold. Below it, nothing happens. Above it, the item lands in the review queue with its answer and probability, and a person decides. Nothing is deleted by default, so a wrong call is a flag someone clears.

What data do you actually see?

Only the fields you map, for example text, authorId and roomId. Nothing else leaves your database. Your connector sends those fields to TypeSafe from your own environment, and the decisions to the review queue. TypeSafe processes model requests in the United States, so check their DPA before mapping a field you consider sensitive.

Can you watch images and uploads?

In Beta. We describe the image with a vision model first, then Jev decides on that description. Jev is text only and does not read images or audio, so the description step is what makes media work.

Does it work in Spanish and other languages?

English is strongest today. TypeSafe says other languages are handled but not as accurately, so run your own Spanish or other-language messages through it before you trust a threshold. We help you set up that test.

Can I self-host it?

The connectors already run inside your own infrastructure. A self-hosted control plane is planned.

Where does my TypeSafe key live?

In your own environment. Connectors run inside your Firebase, Supabase, Appwrite, Convex, Atlas or PocketBase project, and the key sits in that project's secrets or function environment, never on our servers. validAIt hosts the control plane only. Model requests are billed to your own TypeSafe account at $0.042 per million input tokens, output free.

What is Jev?

A decision model from TypeSafe AI, launched on 15 September 2026. It answers typed questions, yes or no with a probability, one of up to 255 options, or a score against a rubric, in 70 to 500 ms end to end, and it does not generate free text. validAIt is built on it and is not affiliated with TypeSafe AI.