Skip to content

List visibility models

Lists the AI models each visibility platform can run.

Every platform has one default model, marked with "default": true. Runs that do not select a model use the default at that model’s own price. Use this endpoint to build model pickers instead of hardcoding model ids: the selectable set can change without notice, and requests that name a model outside this list are rejected at creation time.

GET /v1/visibility/models
HeaderRequiredValue
AuthorizationYesBearer sw_api_live_...

Required scope:

runs:read
Terminal window
curl -s https://api.sleepwalker.ai/v1/visibility/models \
-H "Authorization: Bearer sw_api_live_..."

The same request in Python and JavaScript:

Python
import requests
resp = requests.get(
"https://api.sleepwalker.ai/v1/visibility/models",
headers={"Authorization": "Bearer sw_api_live_..."},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://api.sleepwalker.ai/v1/visibility/models", {
headers: { Authorization: "Bearer sw_api_live_..." },
});
const data = await resp.json();
console.log(data);
{
"platforms": {
"perplexity": [
{ "id": "sonar", "label": "Sonar", "default": true, "tier": "standard", "credits_per_probe": "1.00" },
{ "id": "sonar-pro", "label": "Sonar Pro", "default": false, "tier": "latest", "credits_per_probe": "3.00" }
],
"openai": [
{ "id": "gpt-5.4-mini", "label": "GPT-5.4 mini", "default": true, "tier": "standard", "credits_per_probe": "1.00" },
{ "id": "gpt-5.6-terra", "label": "GPT-5.6 Terra", "default": false, "tier": "latest", "credits_per_probe": "6.00" },
{ "id": "gpt-5.5", "label": "GPT-5.5", "default": false, "tier": "latest", "credits_per_probe": "12.00" },
{ "id": "gpt-5.6-sol", "label": "GPT-5.6 Sol", "default": false, "tier": "latest", "credits_per_probe": "15.00" },
{ "id": "gpt-5.4", "label": "GPT-5.4", "default": false, "tier": "prior", "credits_per_probe": "4.00" },
{ "id": "gpt-5.4-nano", "label": "GPT-5.4 nano", "default": false, "tier": "lite", "credits_per_probe": "1.00" },
{ "id": "gpt-5.6-luna", "label": "GPT-5.6 Luna", "default": false, "tier": "lite", "credits_per_probe": "2.00" }
],
"grok": [
{ "id": "grok-4.3", "label": "Grok 4.3", "default": true, "tier": "latest", "credits_per_probe": "6.00" },
{ "id": "grok-4.20-0309-non-reasoning", "label": "Grok 4.20", "default": false, "tier": "prior", "credits_per_probe": "6.00" }
],
"gemini": [
{ "id": "gemini-3.6-flash", "label": "Gemini 3.6 Flash", "default": true, "tier": "latest", "credits_per_probe": "2.00" },
{ "id": "gemini-3.5-flash", "label": "Gemini 3.5 Flash", "default": false, "tier": "prior", "credits_per_probe": "2.00" },
{ "id": "gemini-2.5-flash", "label": "Gemini 2.5 Flash", "default": false, "tier": "prior", "credits_per_probe": "2.00" },
{ "id": "gemini-3.1-flash-lite", "label": "Gemini 3.1 Flash Lite", "default": false, "tier": "lite", "credits_per_probe": "1.00" },
{ "id": "gemini-3.5-flash-lite", "label": "Gemini 3.5 Flash Lite", "default": false, "tier": "lite", "credits_per_probe": "1.00" }
]
}
}

The lists above are an example. Treat the live response as the source of truth: platforms can gain or lose selectable models, and a platform can offer only its default.

credits_per_probe is the price for that specific model. Always read it from the response rather than inferring price from tier. Each model is priced individually by what it costs to run, so two models in the same tier can cost different amounts (a flagship that writes long, reasoned answers costs more than a cheaper flagship on the same tier). Entries with default: true are what runs use when nothing is selected; their credits_per_probe applies like any other model’s (platform defaults range from 1 to 6 credits).

tier is a generation badge for grouping and role keywords, not a price: latest (current flagship), prior (previous generation, useful for keeping a comparable baseline when providers move the frontier), lite (budget models), or standard (the default). A platform’s default can itself be the latest model and carry the latest badge; its price is its own credits_per_probe like any other entry. Lite models may skip web search on some prompts and return fewer or no citations. They are the economical choice, not the most consistent one.

The response also contains a roles object: a complete {platform: {default, latest, prior}} table that maps every role to a concrete model id for every platform, with no gaps. Roles may share a model: a platform whose default is already its newest model maps both default and latest to the same id, and a platform with no previous generation maps prior to its default.

{
"roles": {
"perplexity": { "default": "sonar", "latest": "sonar-pro", "prior": "sonar" },
"openai": { "default": "gpt-5.4-mini", "latest": "gpt-5.6-terra", "prior": "gpt-5.4" },
"grok": { "default": "grok-4.3", "latest": "grok-4.3", "prior": "grok-4.20-0309-non-reasoning" },
"gemini": { "default": "gemini-3.6-flash", "latest": "gemini-3.6-flash", "prior": "gemini-3.5-flash" }
}
}

Role names are also accepted directly as model values when creating a run: "models": {"openai": "latest"} resolves to that platform’s current latest model at creation time. The probe stores the resolved model id, and the price follows the resolved model, so a role that resolves to the default costs that default’s own credits_per_probe.

Several models can share a tier (for example a superseded flagship kept for cross-version studies); the roles table names the one a keyword resolves to. Role keywords track the platform’s current model for that slot and can change when the catalog updates. Pin an exact model id when a study depends on a specific version.

Pass a model per platform when creating a run. See Create visibility run for the models map (matrix mode), the probe model field (explicit probes), and how tier pricing interacts with partial funding.