PaidSync>Blog>How to Use Jev AI to Find Negative Keywords in Google Ads

How to Use Jev AI to Find Negative Keywords in Google Ads

Founder written
Author: Ahmed Ashraf|6 min read|Updated September 30, 2026
$1B+ ad revenue generated $500M+ managed Google Premier Partner (top 3%) 610+ MCP tools

Jev is a decision model from TypeSafe AI that answers typed yes-or-no, choice and score questions in about 100 milliseconds, for $0.042 per million input tokens. It can't chat or connect to your ad accounts on its own. Pair it with PaidSync in a short script: PaidSync pulls your Google Ads search terms, Jev flags the ones that don't fit your business, and you approve the negative keywords before anything changes.

Where this stands on 30 September 2026. Jev opened in early access on 15 September, and TypeSafe's sign-up rules have changed more than once since, so check typesafe.ai before you build. We haven't run this recipe on a live account yet. The code follows TypeSafe's API docs and PaidSync's own tool definitions, both read on 30 September 2026.

What Is Jev AI From TypeSafe

TypeSafe calls Jev a System One model, built for fast, structured decisions that software can use directly. It doesn't write text, write code or hold a conversation. TypeSafe says plainly that it isn't a replacement for the model behind Claude Code, Cursor or Muse Spark.

You send Jev a piece of state, such as a search term and its numbers, plus questions you name. There are three question types:

TypeSafe says most queries finish in about 100 milliseconds and quotes 70 to 500 milliseconds end to end. Input costs $0.042 per million tokens and output is free. OpenAI announced a similar Decisions API on 29 September, in limited preview.

Why the Search Terms Report Suits Jev

A Google Ads search terms report can run to hundreds of rows, and PaidSync returns up to 500 per call, highest cost first. Every row asks the same question: would someone typing this buy from us? That's a yes-or-no call, which is what Jev is built for.

A chat assistant reads those rows one at a time and gets slower and pricier as the list grows. Jev scores each one in a fraction of a second, and at an estimated 400 input tokens a term (our estimate for the prompt in the script below), 500 terms come to roughly 200,000 tokens, under one cent. The probability it returns tells you which calls to trust and which to check by hand.

One agency, Dijitalpi, reports that Jev classified thousands of search terms across 15 brands in eight seconds for about US$0.20, with a specialist reviewing before any change. It didn't publish the counts, and we haven't checked them.

How the Recipe Works in 4 Steps

1

PaidSync pulls your search terms

The script connects to PaidSync with an API key and calls get_search_terms_report for the last 30 days. It keeps the terms that spent money and never converted.

2

Jev answers two questions per term

A yes-or-no question (is this term unrelated to what you sell?) and a choice question (is the searcher buying, learning, job hunting, looking for something free, or something else?). Each answer comes back with a probability.

3

The script routes by confidence

Terms Jev is very sure about become proposed negatives. The unsure middle goes to a person, or to Claude or ChatGPT for a second look. Everything else stays.

4

You approve, then add the negatives

Open Claude or ChatGPT with PaidSync connected, paste the approved list and ask it to add them as negative keywords. PaidSync's add_negative_keywords tool makes the change, and the assistant's confirmation prompt is your last check.

The Google Ads Search Term Script

Plain JavaScript with the official MCP SDK. Set PAIDSYNC_API_KEY (from the PaidSync dashboard) and TYPESAFE_API_KEY (from TypeSafe) as environment variables, and change BUSINESS to one sentence about what you sell.

// triage.mjs. Run: node triage.mjs (Node 20+, after npm install @modelcontextprotocol/sdk)
// Keys come from environment variables and travel in headers, never in the URL.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const BUSINESS = "We sell project management software to construction companies.";

// 1. PaidSync pulls the search terms (up to 500 rows per call, highest cost first)
const transport = new StreamableHTTPClientTransport(new URL("https://mcp.paidsync.ai/mcp"), {
  requestInit: { headers: { "x-api-key": process.env.PAIDSYNC_API_KEY } },
});
const paidsync = new Client({ name: "jev-search-terms", version: "1.0.0" });
await paidsync.connect(transport);
const res = await paidsync.callTool({
  name: "get_search_terms_report",
  // several accounts? first call set_active_account with { account_id: "123-456-7890" }
  arguments: { date_range: "last_30_days" },
});
const report = res.structuredContent;
if (!report?.success) throw new Error(report?.message ?? "No report returned");
const terms = report.data.searchTerms.filter(
  (t) => Number(t.cost) > 0 && Number(t.conversions) === 0,
);

// 2. Jev answers two typed questions about each term
async function ask(t) {
  const r = await fetch("https://api.typesafe.ai/v1/systemone", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.TYPESAFE_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: "jev-latest",
      state: { business: BUSINESS, search_term: t.searchTerm, clicks: t.clicks, cost: t.cost },
      questions: {
        unrelated: {
          type: "noul",
          instructions: "Is this search term unrelated to what the business sells?",
          criteria: {
            true: "A person searching this would not buy from this business",
            false: "A person searching this could become a customer",
          },
        },
        intent: {
          type: "choice",
          instructions: "What is the searcher most likely looking for?",
          criteria: {
            buy: "To buy or compare products like this",
            learn: "Information about the topic",
            job: "A job or salary information",
            free: "Something free or DIY",
            other: "Something unrelated",
          },
        },
      },
    }),
  });
  if (!r.ok) throw new Error(`Jev returned ${r.status}`);
  const { answers } = await r.json();
  return {
    term: t.searchTerm,
    cost: Number(t.cost),
    unrelated: answers.unrelated.noul,
    intent: answers.intent.choice,
  };
}

const scored = [];
for (let i = 0; i < terms.length; i += 10) {
  scored.push(...(await Promise.all(terms.slice(i, i + 10).map(ask))));
  await new Promise((done) => setTimeout(done, 250)); // stays under Jev's default rate limit
}

// 3. Route by confidence. Tune both thresholds on your own account.
console.log("Proposed negatives:");
console.table(scored.filter((s) => s.unrelated >= 0.85));
console.log("Needs a person:");
console.table(scored.filter((s) => s.unrelated >= 0.4 && s.unrelated < 0.85));
await paidsync.close();

The pause between batches keeps you under Jev's default rate limit, which TypeSafe lists as 40 a second, so 500 terms take well under a minute. Start with a strict threshold, read what lands in each list for a week or two, then loosen it.

Keep a Person on the Write Step

The script never changes your account, and that's by design. A PaidSync API key can read and preview Google Ads but can't apply Google Ads changes, so adding negatives always goes through a signed-in session where you see the change first. On the other platforms a key can apply changes, under the same checks as a sign-in. Google Ads creates and most other creates run as a dry-run preview first, destructive changes such as pauses and deletes need an explicit confirm, and every applied change is logged with a 7-day before-and-after result.

Other Jobs for Jev With Your Ad Data

Each one follows the same shape. PaidSync reads, Jev scores, a person or a chat assistant decides, and PaidSync writes. For the approval step, see how to connect your ads to Claude, and for more ways to cut waste, see negative keyword automation with AI.

Frequently Asked Questions

Can Jev connect to Google Ads?

No. Jev only answers questions you send it and doesn't connect to any service. PaidSync supplies the Google Ads data, and a script passes it to Jev.

What is Jev AI?

Jev is a decision model from TypeSafe AI, in early access since 15 September 2026. It answers typed yes-or-no, choice and score questions with a probability, in about 100 milliseconds. It doesn't chat, write text or take actions, so it isn't an agent.

How much does it cost to sort 500 search terms with Jev?

At an estimated 400 input tokens a term, 500 terms is roughly 200,000 tokens. At $0.042 per million input tokens with free output, that's under one cent on the Jev side.

How do I find negative keywords in Google Ads with AI?

Pull the search terms report, flag terms that spent money without converting and don't fit what you sell, and have a person check the list before adding it. In this recipe PaidSync pulls the report, Jev flags the terms, and you add the approved negatives in Claude or ChatGPT.

Why doesn't the script add the negatives itself?

A PaidSync API key can read and preview Google Ads but can't apply Google Ads changes. Adding negatives goes through a signed-in session in Claude or ChatGPT, so a person sees every change first.

Should I use Jev or OpenAI's Decisions API?

Both answer questions with a fixed set of answers. OpenAI announced its Decisions API on 29 September 2026 in limited preview. The PaidSync side of this recipe is the same with either.

What does PaidSync cost for this?

PaidSync is free for 15 tasks a month with no credit card, then plans start at $99 a month. Each report uses one or more tasks.

Which New AI Agents Can Run Google Ads and Meta Ads in 2026→ Negative keyword automation with AI→ The PaidSync MCP server→

PaidSync runs 610+ tools across 14 ad and analytics platforms. Connect your accounts once and use them in any AI assistant you like.

Get Started Free Book a Demo