Muse uses the same gd-… key and shared Guard balance. Generation exposes three exact model IDs: muse-wonder-1.0, muse-spark-1.3, and muse-spark-1.2. The short name muse resolves to Muse Wonder 1.0. No other public Muse IDs exist.
Get a key from @guardapi, then choose HTTP, the Python SDK, or the Node.js SDK. One shared key is issued; no separate Meta account is required.
- Save the key in
GUARD_API_KEY; do not commit it or print it to logs. - Choose Messages, Chat Completions, or Responses. Applications with an OpenAI-compatible API use
https://api.guardrelay.ai/v1, Anthropic clients usehttps://api.guardrelay.ai. - Send the exact
model(muse-wonder-1.0) and an output budget. Use a regular JSON response for the first request. - Check the text, terminal state, and
usage; then enablestream: trueif needed.
export GUARD_API_KEY="gd-your-key"
curl https://api.guardrelay.ai/v1/chat/completions \
-H "Authorization: Bearer $GUARD_API_KEY" \
-H "content-type: application/json" \
-d '{"model":"muse-wonder-1.0","messages":[{"role":"user","content":"Reply with OK"}],"max_tokens":4096}'$env:GUARD_API_KEY = "gd-your-key"
$headers = @{ Authorization = "Bearer $env:GUARD_API_KEY" }
$body = @{
model = "muse-wonder-1.0"
max_tokens = 4096
messages = @(@{ role = "user"; content = "Reply with OK" })
} | ConvertTo-Json -Depth 10
Invoke-RestMethod -Method Post `
-Uri "https://api.guardrelay.ai/v1/chat/completions" `
-Headers $headers `
-ContentType "application/json" `
-Body $body| API | Path | Output budget |
|---|---|---|
| Messages | POST /v1/messages | max_tokens; 131,072 when omitted, or 32,000 when the key's balance cannot cover that reserve plus eight more reserves at 32,000 |
| Chat Completions | POST /v1/chat/completions | max_tokens / max_completion_tokens; 4096 when omitted |
| Responses | POST /v1/responses | max_output_tokens; 4096 when omitted |
The defaults are set by the Guard gateway, not by the model.
The family is selected by the exact model on the shared address. Anthropic clients use https://api.guardrelay.ai (the client appends /v1/messages itself), OpenAI-compatible ones use https://api.guardrelay.ai/v1.
Messages:
curl https://api.guardrelay.ai/v1/messages \
-H "Authorization: Bearer $GUARD_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"muse-wonder-1.0","max_tokens":4096,"messages":[{"role":"user","content":"Reply with OK"}]}'Responses:
curl https://api.guardrelay.ai/v1/responses \
-H "Authorization: Bearer $GUARD_API_KEY" \
-H "content-type: application/json" \
-d '{"model":"muse-wonder-1.0","input":"Reply with OK","max_output_tokens":4096}'Chat Completions is shown above, in the quick start.
| Model ID | Name | Window | Answer limit | Input |
|---|---|---|---|---|
muse-wonder-1.0 | Muse Wonder 1.0 | 1,048,576 | Meta does not publish a limit | Text, images, PDF |
muse-spark-1.3 | Muse Spark 1.3 | 1,048,576 | Meta does not publish a limit | Text, images, PDF |
muse-spark-1.2 | Muse Spark 1.2 | 1,048,576 | Meta does not publish a limit | Text, images, PDF |
Images and PDF are sent as embedded base64 data. How to do it is shown on the Vision and PDF / documents pages.
| Model | Uncached input / 1M | Cache read / 1M | Output / 1M |
|---|---|---|---|
muse-wonder-1.0 | $4.00 | $0.20 | $20.00 |
muse-spark-1.3 | $1.25 | $0.15 | $4.25 |
muse-spark-1.2 | $1.25 | $0.15 | $4.25 |
Rates are USD per 1M tokens and equal the Meta Model API rates. Writing to the cache has no separate charge, and a cache read is billed at the rate in the table. A long context is billed without a surcharge.
For muse-wonder-1.0, 4,000 uncached input + 8,000 cached input + 1,000 output tokens cost 4000×4.00/1M + 8000×0.20/1M + 1000×20.00/1M = $0.03760000.
Web search is billed separately: $0.0025 for each Muse search request, starting with the first. See the search section below for details.
The reasoning level is set by a field of the selected API. Muse does not return the full reasoning text; in Responses with reasoning.summary: "auto" Meta may return a short summary of it (a reasoning item with a summary field).
| API | Level field |
|---|---|
| Chat Completions | reasoning_effort |
| Responses | reasoning.effort |
| Messages | output_config.effort |
Level values: minimal, low, medium, high, xhigh, and max. The value none is not accepted and gets a refusal.
Muse searches the web with Meta search through Messages and Responses; Chat Completions has no search. Guard translates the web_search_20250305 tool that Claude Code sends into Meta search.
{
"model": "muse-wonder-1.0",
"max_tokens": 4096,
"messages": [{"role": "user", "content": "What is new today?"}],
"tools": [{"type": "web_search_20250305", "name": "web_search"}]
}| Item | Charge |
|---|---|
| A search request | $0.0025 for each request, starting with the first |
| Before the answer | the cost of five searches (5 × $0.0025 = $0.0125) is held; the final charge uses the actual number of searches |
| Reading a page | goes through the native Meta search and is not counted as a paid search by itself |
- The native Meta search reads the pages. Muse has no separate
web_fetchtool. - The search limit
max_uses, which Claude Code sends with every search, is accepted but not kept: Meta decides how many searches to run. Every search is billed at the price above. Search from Claude Code works. - Meta does not support site lists (
allowed_domains,blocked_domains): a request with them gets a clear refusal.
POST /v1/messages/count_tokens works for Muse as well. The free count before an answer returns an approximate estimate, not an exact Meta count. It is a reference number: the charge follows the actual usage, not the estimate.
The Muse server prompt is configured like that of the other families: the key needs an active entitlement for the Muse family and the application option turned on. Without them, the request goes without a prompt. See Server prompts for details.
- The error format, codes, and
request_idare shared by all families: see Error codes. - A clear refusal comes back for, among other cases: video and audio; the reasoning level
none; site lists in search; a separateweb_fetchtool.