# One API key, many client voices: a multi-profile setup for agencies and ghostwriters · ScriptGrain

> How to run several client voices from one ScriptGrain API key or MCP connection: one profile per client, generation and scoring per profile, the voice gate in your pipeline, and what it costs on Studio and Agency.

Canonical: https://scriptgrain.com/blog/one-api-key-many-client-voices

# One API key, many client voices: a multi-profile setup for agencies and ghostwriters

*By Jack Stovell · 2026-09-30 · Guides*

One API key holds every client's voice as its own profile. Ten clients, ten profiles, one bearer token. Your pipeline generates and scores against the right profile every time, no bleed, no mixing Client A's tone into Client B's draft, on every plan including Free.

*What follows was measured against the live ScriptGrain API and MCP server, checked 2026-09-20. Numbers, endpoints and limits below come straight from that check, not from marketing copy.*

## One key, one profile per client

Here's the thing agencies get wrong first: they treat voice like a global setting. One tone, tweaked slightly per job. That works until you have twelve clients and a deadline, and then it falls apart fast.

The fix is structural, not stylistic. Each client gets a profile, built from 1 to 20 writing samples of 50 to 5,000 words each. The profile carries a name, a narrative description, a confidence_score and a 45-attribute breakdown of how that client actually writes. Your key sits above all of it. One `sg_live_` bearer token, issued from Settings then API, calls whichever profile the job needs.

So the ghostwriter juggling six memoirists doesn't rewrite their brain six times a day. They call the right `profile_id`. That's it. No manual tone-matching, no "does this sound like Dave or like Priya" guesswork.

## Creating and listing client profiles

Setting one up looks like this:

```

POST /v1/profiles

{

"name": "client_dave",

"samples": ["...", "..."]

}

```

That returns a `profile_id` and a status of `processing`. Extraction isn't instant, so you poll:

```

GET /v1/profiles/{id}

```

until status flips to complete. At that point you get the narrative, the `confidence_score`, and the full attributes object. Do this once per client, not once per job.

Once you've built a handful, list them:

```

GET /v1/profiles

```

That's your roster. Every client, every profile, one call. Useful when a new team member joins and needs to see what's already built rather than duplicating work.

Extractions are rate-limited: 5 an hour per key. Fine for onboarding a batch of new clients in one sitting; annoying if you try to rebuild the same profile five times in five minutes because you didn't like the first narrative summary. Don't do that. Read the narrative, trust it, move on.

## Generating and scoring per client

Generation is where the profile earns its keep:

```

POST /v1/generations

{

"profile_id": "client_dave",

"brief": "...",

"content_type": "newsletter",

"word_count_target": 800,

"register": "conversational",

"english_variant": "uk"

}

```

That returns content, a word count, and a `voice_match_score` in the same response. No separate step. You generate and you find out immediately whether it sounds like Dave or sounds like nobody in particular.

Want three angles on the same brief? Set `variants` to 1 through 3. Each variant costs 1 credit, deducted only after delivery, so a generation that fails silently or errors out doesn't cost you anything. There's also an `Idempotency-Key` header, which matters more than it sounds: retry a call safely without accidentally billing twice or duplicating the draft.

If you already have a piece and just want a check, that's separate:

```

POST /v1/voice-match

{

"profile_id": "client_dave",

"text": "..."

}

```

Free, always. Returns a score from 0 to 1, notes, and per-feature deltas telling you exactly where the drift is. Too many long sentences? Too formal? It'll say.

There's also `POST /v1/compare-voice`, which measures a main piece against up to three others with no profile involved at all, also free. Handy for "does this new writer sound like our house style" without building a formal profile first.

Full reference for all of this: [/reference/brand-voice-api](https://scriptgrain.com/reference/brand-voice-api).

## The voice gate: score before anything ships

Here's the rule. Nothing goes to a client until it clears the threshold.

In pseudo-code, the loop is dull on purpose:

```

generate(profile_id, brief)

score = voice_match(profile_id, draft)

if score < threshold:

polish(draft, target=0.9)

or send back for a rewrite

else:

save_edit(draft)

```

That's the whole gate. Generate, score, decide. If the score's under threshold, you've got two moves: run `POST /v1/polish`, which nudges the draft toward a target (0.9 by default) for 1 credit, with a free skip if it already passes; or bin it and regenerate with tighter direction. Either way, nothing ships on a hopeful guess.

Once a draft's approved, `POST /v1/generations/{id}/edit` saves the final version and feeds that back into the system's learning. That step's free. It's also the bit agencies skip and then wonder why voice drift creeps back in six months later. Don't skip it.

To be fair, a score under threshold isn't a failure of the tool. It's the tool doing its job: catching drift before a client does. That's the whole point of gating in the first place.

## Doing it from Claude or ChatGPT over MCP

Same loop, no separate dashboard. The MCP server sits at `https://mcp.scriptgrain.com/mcp` (streamable HTTP, with a legacy SSE endpoint at `/sse`), and it exposes 30 tools on every plan including Free.

From Claude Code:

```

claude mcp add scriptgrain https://mcp.scriptgrain.com/mcp --transport http --header "Authorization: Bearer sg_live_…"

```

From claude.ai: Settings, Connectors, Add custom connector, paste the URL, sign in once via ScriptGrain's consent page. ChatGPT: same shape, Settings then Connectors then Add custom connector, wherever the plan allows. Meta Muse takes the same URL as a custom integration. Cursor and similar clients just need the URL plus the bearer header. Gemini CLI wants it in `settings.json`:

```

{

"mcpServers": {

"scriptgrain": {

"httpUrl": "https://mcp.scriptgrain.com/mcp",

"headers": { "Authorization": "Bearer sg_live_…" }

}

}

}

```

The tool names map directly onto the REST calls you already know: `list_profiles`, `create_profile`, `get_profile`, `generate_content` (1 credit), `check_voice_match` (free), `compare_voice` (free), `polish`, `humanize`, `save_edit` (free), `ai_detect` (free), `check_novelty`, `what_next`, `get_memory`, `add_to_memory`, `rewrite_page`, `get_billing`, `upgrade_plan`.

Two built-in prompts do the heavy lifting for you: `write_in_my_voice` and `build_my_voice_profile`. And the working loop inside an assistant is the same four steps every time: `create_profile`, `generate_content`, `check_voice_match`, `save_edit`. Ask Claude to "write this newsletter in Dave's voice and check the score before sending" and it'll run the whole thing without you touching a terminal.

Full tool list and schemas: [/reference/mcp-tool-reference](https://scriptgrain.com/reference/mcp-tool-reference).

## Costs and limits

Every plan gets the same key, the same 60 requests a minute (429 if you go over), and the same 5 extractions an hour. What changes is scale.

Plan · Profiles · Generations · Extractions · Brand mimics
Operator, £29/mo or £279/yr ($40 / $378) · 3 · 75 · 5 · 3
Studio, £99/mo or £949/yr ($134 / $1,284) · 10 · 400 · 20 · 10
Agency, £299/mo or £2,870/yr ($405 / $3,882) · unlimited · 1,500 · unlimited · 50

Studio caps at 10 client profiles. Agency goes unlimited. That's the practical line for most shops: if you're running more than ten client voices at once, Agency is where the ceiling disappears.

Credits are shared across the whole key, not siloed per profile, so a quiet month for Client A frees up room for a busy month with Client B. One credit produces one draft variant. Outlines, voice-match scoring, comparing two pieces, AI-detect and reading profiles are all free. Polish and humanize cost 1 credit each, with a free skip if the draft already passes. Page rewrites run 1 credit per 1,500 words. Brand mimic costs 1 brand-mimic credit and needs explicit consent that you own or may use the site in question, no exceptions there.

Top-ups: £10 ($14) buys 40 extra generation credits, useful for a busy sprint without upgrading the whole plan. And credits only get deducted after a draft is delivered, so a failed call or a dropped connection never costs you.

Full breakdown: [/reference/api-plan-limits](https://scriptgrain.com/reference/api-plan-limits). More on the general setup: [/ai-writing-api-and-mcp-server](https://scriptgrain.com/ai-writing-api-and-mcp-server), and workflow notes for [/for-agencies](https://scriptgrain.com/for-agencies) and [/for-ghostwriters](https://scriptgrain.com/for-ghostwriters).

## Questions

### Can one API key really keep ten client voices separate?

Yes. Separation happens at the profile level, not the key level. Every call carries a `profile_id`, so generation and scoring always run against the right client's attributes. The key is just the door; the profile decides which room you're in. Nothing about one client's writing touches another's, no matter how many profiles sit under the same account.

### What happens if a draft fails the voice gate?

You get a `voice_match_score` under threshold, plus notes and per-feature deltas explaining why. From there: run `POST /v1/polish` toward a target (0.9 default) for 1 credit, or regenerate with sharper direction in the brief. Either path is cheaper than sending an off-voice draft to a client and hoping nobody notices.

### Does extracting a profile cost a generation credit?

No. Extractions are free but rate-limited to 5 an hour per key. Building or rebuilding a client profile doesn't touch your generation allowance at all; that's a separate pool entirely, governed by plan tier rather than credits.

### Can I run this whole workflow without writing any code?

Yes, through MCP. Connect Claude, ChatGPT, or another supported client to `https://mcp.scriptgrain.com/mcp`, sign in once, and the same loop (`create_profile`, `generate_content`, `check_voice_match`, `save_edit`) runs conversationally. No terminal required, though Claude Code and Cursor both work if you'd rather stay in an editor.

### What's the practical limit before I need Agency instead of Studio?

Ten profiles. Studio caps there; Agency removes the cap and bumps generations to 1,500 a month. If you're running an eleventh client voice, or expect to soon, that's the point Studio stops fitting and Agency starts making sense.

[More from the ScriptGrain Journal](https://scriptgrain.com/blog)
