Voice Match API: score any text against a voice profile

By Jack Stovell X · Instagram · LinkedIn · published 2026-10-29

The Voice Match API takes any text of 20 or more words and returns a 0 to 1 score against a measured voice profile, free on every plan, with the numbers behind it. Developers, content teams and assistant users call it to check a draft before it ships. You get a verdict and the evidence.

At a glance

What it does: Scores any text against a voice profile from 0 to 1 and shows the measured features behind the number.

Endpoint`POST /v1/voice-match`
MCP tool`check_voice_match`
CostFree on every plan
LimitsText of 20+ words; 200 scores an hour per account

How the score is made

Some features are counted. Others are judged. The score blends both, and it shows its working.

Counting happens in code: sentence lengths, contraction and punctuation rates, signature-phrase use and more. No model opinion involved, so the same text gives the same numbers every time. A judge model then covers the qualitative subset, the things a counter can't see. A weighted comparator turns all of it into the single 0 to 1 score.

The profile it scores against has 45 measured attributes across eight layers. It comes from a two-pass stylometric extraction of the writer's own human-written samples. ScriptGrain measures writing and is never trained on it. The full method is published in the voice measurement framework, so you can check how each feature is defined.

One limit: the request needs a profile whose status is complete.

Reading the deltas

A score tells you something is off. The deltas tell you what. Each entry in `deltas` lists a feature with the draft number, the profile number and a 0 to 1 similarity. The `notes` are rendered from those same deltas, so they never say more than the numbers do.

Take the live example. A 61-word paragraph scored 0.64 against ScriptGrain's own profile. That's partial. Typical bands run like this:

  1. On-voice text scores 0.85 to 0.95.
  2. 0.5 to 0.8 is partial.
  3. Under 0.45 is clearly off voice.

Now read the deltas. Sentence length matched (15.3 vs 16.9 words), so leave it alone. Contractions diverged (0 vs 21.2 per 1,000 words). Sentence-length variance diverged too (110 vs 38). So the fix is plain: add contractions, and rein in the swing between very long and very short sentences. Two edits, not a rewrite.

Check `score_context` as well. It lists measured caveats, such as a short sample, that may make the score under-read.

When to use it

Use it wherever a draft needs a verdict before it moves on.

Need a side-by-side of two texts rather than a score against a profile? That's voice compare. Prefer a browser to an endpoint? The brand voice consistency checker does the job without code.

Request and response

Called live on 29 October 2026: a 61-word paragraph scored against ScriptGrain's own brand profile (deltas cut to two). It scored 0.64, partial, and the deltas say why.

curl -X POST https://auth.scriptgrain.com/functions/v1/api-v1/v1/voice-match \
  -H "Authorization: Bearer sg_live_..." \
  -H "Content-Type: application/json" \
  -d '{"profile_id": "853dd07f-8657-4bf8-a2b0-3f84e147d6f4",
       "text": "Most AI writing tools describe your voice. We measure it. ..."}'
{
  "profile_id": "853dd07f-8657-4bf8-a2b0-3f84e147d6f4",
  "voice_match_score": 0.64,
  "deltas": [
    {
      "feature": "avg_sentence_length",
      "label": "average sentence length",
      "similarity": 0.86,
      "detail": "average sentence length (draft 15.3 vs profile 16.9 words)"
    },
    {
      "feature": "sentence_length_variance",
      "label": "sentence-length variance",
      "similarity": 0,
      "detail": "sentence-length variance (draft 110 vs profile 38)"
    }
  ],
  "score_context": [
    "Short sample: at 61 words, punctuation and rhythm rates are rough estimates, and scores on pieces this short swing widely."
  ],
  "word_count": 61
}

In Claude, ChatGPT or Cursor

Over MCP this is the tool `check_voice_match`. Connect `https://mcp.scriptgrain.com/mcp` once (a custom connector in claude.ai, developer mode in ChatGPT on the web, the MCP settings in Cursor, or `claude mcp add` in Claude Code), then ask in plain words:

Check this draft against my ScriptGrain voice and tell me the three features furthest from my profile, with the numbers.

A guest with no account can run the same check through the keyless `/try` endpoint, 5 checks an hour per network.

Get a key

API and MCP access is on every plan, Free included. Create a free account (no card), then mint a key at Settings, then API: it starts `sg_live_`, is shown once, and goes in an `Authorization: Bearer` header. Every request, field and error code is in the OpenAPI spec.

Questions

What does the Voice Match API return?

A 0 to 1 score for the text you send, plus deltas listing each feature with the draft-vs-profile numbers and a 0 to 1 similarity. You also get notes rendered from those deltas, and score_context, which flags measured caveats that may make the score under-read.

Does it cost anything to call?

Voice match is free on every plan, Free included. It's limited to 200 scores an hour per account. The REST API and the MCP server at https://mcp.scriptgrain.com/mcp are on every plan, and the rate limit is 60 requests a minute per key.

How do I authenticate?

Mint an sg_live_ key at Settings, then API, and send it as Authorization: Bearer. Other API calls draw on the same credits as the app, so there's no separate API quota. Payments never happen through the API, whichever call you make.

What score counts as on voice?

On-voice text typically scores 0.85 to 0.95. A score of 0.5 to 0.8 is partial, and under 0.45 is clearly off voice. Don't read the number alone, though. The deltas show which features dragged it down, so you know what to fix.

Related