Docs

Primitives

The Optimizer rewrites one outbound draft and needs no connected data. Search and Eval are the two primitives over your corpus: Search returns rows and quotes from it, Eval grades a draft against it. Chat, Routines and Subscriptions are an orchestration layer on top.

Amdahl gives you three calls. The Message Optimizer needs nothing but a draft. Search and Eval are the two primitives over your buyer conversations, which Amdahl holds server-side, and everything else on the API is either built from those two or manages the data behind them.

The Optimizer

POST /messages/optimize (the messages tool over MCP) takes one outbound draft, an email or a LinkedIn message, and returns a stronger version in the sender's voice on the same call, usually in under 30 seconds. When nothing it tries beats the draft, it returns the draft unchanged with edits the sender can make.

  • It needs no connected data. Its default is a style pass: how the draft reads and how clearly it asks. That is why it is the first result a new workspace can get.
  • It keeps what must stay exact. Names, numbers, dates, links and merge fields come back as written, and a rewrite that changes one is discarded.
  • It can read your corpus when you ask. With "evidence": "workspace" on a workspace with synced conversations, it also grades the draft against what your customers said and lists the claims nothing in their words backs.
  • It sends nothing. It hands back text, and nothing in your tools or your corpus changes. Where the text goes is your decision.

Scope: messages:execute. Start with Optimize a cold email; the reference is Message Optimizer.

The corpus

The corpus is every customer conversation Amdahl holds for your workspace: call and meeting transcripts, email, and CRM records, synced from your connections. You never send it with a request. What you send is a question or a draft, and the server reads the corpus to answer.

That is the main difference from a model API. The state your call depends on is already on the server, scoped to your workspace and to what your credential may read. It also means a call on an empty workspace has nothing to read: check GET /search/overview before you trust an empty result.

The two primitives

SearchEval
CallPOST /search/queryPOST /evals/run
ShapeSynchronous, one blocking call (a 15 second ceiling on the default path)Async: returns a run id, you poll with wait_ms
You sendTyped filters, a plain-language question, a meaning to match, or a quoted phraseA prompt, a drafted message, or both, plus optional scope
You get backRows or utterances, the SQL or terms that produced them, and a corpus block naming the store that answeredA pass or fail per rubric line, the customer quotes each verdict rests on, a send/hold bit, and an improved reusable prompt
Scopedata:readevals:execute to run, evals:read to read
Changes your dataNeverNever. A run is read-pure.
ReferenceSearchEvals API

Search answers a question about your conversations. Every call lands on one of four lanes: filter (typed predicates compiled into one SELECT, no model involved), fuzzy (a plain-language ask turned into SQL), semantic (ranked by meaning against customer-side utterances), or lexical (exact terms, reached by quoting a phrase). The response names the lane that ran in mode_ran, and the lanes read different stores at different grains, so read that field before you compare two results.

Eval

Eval answers "is this draft any good, and what would make it better", scored against what your customers said. The built-in instrument is prompt-and-message-eval: five binary rubric lines on the message, five on the prompt, quotes that are retrieved and never written by the model, and a judge that scores your draft and the improved version blind in one call. How grading works explains the run; the Evals API is the field reference.

Choosing between them

You wantReach for
A better version of one outbound draft, now, with nothing connectedThe Optimizer
That, plus the draft's claims checked against what your customers saidThe Optimizer with evidence: "workspace"
A number, a list, a slice of deals or conversationsSearch, mode: "filter" when you know the fields; plain language otherwise
What customers said about a topic, in their wordsSearch, mode: "semantic" with hydrate: true
Whether a specific word or name was saidSearch with the term in double quotes (the lexical lane)
Every claim in a draft ruled on, with the quotes behind each verdictEval, the default rewrite mode
A verdict on copy before it goes outEval, inputs.mode: "gate" for just the send/hold bit
A better prompt for next timeEval, the default rewrite mode
An answer that needs several steps, outside market signal, or a written deliverableA Chat, which calls both for you

The orchestration layer

These are conveniences built on the two primitives. None of them reads anything Search and Eval cannot.

  • Chat runs an agent server-side that calls Search, Eval and, when you allow it, outside market search. You get handles back and poll. The default depth answers from your own corpus; depth: "deep" adds market search.
  • Agents are saved instructions a Chat can run by name.
  • Routines fire a Chat on a cron.
  • Subscriptions fire a Chat when an event happens.

Use them when you would otherwise write the loop yourself. Skip them when you want control flow in your own code: two Search calls and an Eval are cheaper and easier to test than a Chat that does the same thing.

Data behind the primitives

Connections manage the CRM, call recorder, email and other sources that fill the corpus: what can be connected, what is connected, and how healthy each sync is. They change what Search and Eval can see; they do not answer questions.

Two ways to call them

The same operations are reachable over REST (https://app.amdahl.ai/api/platform/v1, with an API key) and over MCP (https://app.amdahl.ai/mcp, see Connect your agent). Over MCP, Search is the search tool, Eval is the evals tool, the orchestration layer is the agents tool, connections are the connections tool, and rewriting an outbound draft is the messages tool.

Next