---
title: "Credentials"
description: "How Sandbox Agent discovers and uses provider credentials."
---

Sandbox Agent discovers API credentials from environment variables and local agent config files.
These credentials are passed through to underlying agent runtimes.

## Credential sources

Credentials are discovered in priority order.

### Environment variables (highest priority)

API keys first:

| Variable | Provider |
|----------|----------|
| `ANTHROPIC_API_KEY` | Anthropic |
| `CLAUDE_API_KEY` | Anthropic fallback |
| `OPENAI_API_KEY` | OpenAI |
| `CODEX_API_KEY` | OpenAI fallback |

OAuth tokens (used when OAuth extraction is enabled):

| Variable | Provider |
|----------|----------|
| `CLAUDE_CODE_OAUTH_TOKEN` | Anthropic |
| `ANTHROPIC_AUTH_TOKEN` | Anthropic fallback |

### Agent config files

| Agent | Config path | Provider |
|-------|-------------|----------|
| Amp | `~/.amp/config.json` | Anthropic |
| Claude Code | `~/.claude.json`, `~/.claude/.credentials.json` | Anthropic |
| Codex | `~/.codex/auth.json` | OpenAI |
| OpenCode | `~/.local/share/opencode/auth.json` | Anthropic/OpenAI |

## Provider requirements by agent

| Agent | Required provider |
|-------|-------------------|
| Claude Code | Anthropic |
| Amp | Anthropic |
| Codex | OpenAI |
| OpenCode | Anthropic or OpenAI |
| Mock | None |

## Error handling behavior

Credential extraction is best-effort:

- Missing or malformed files are skipped.
- Discovery continues to later sources.
- Missing credentials mark providers unavailable instead of failing server startup.

When prompting, Sandbox Agent does not pre-validate provider credentials. Agent-native authentication errors surface through session events/output.

## Checking credential status

### API

`sdk.listAgents()` includes `credentialsAvailable` per agent.

```json
{
  "agents": [
    {
      "id": "claude",
      "installed": true,
      "credentialsAvailable": true
    },
    {
      "id": "codex",
      "installed": true,
      "credentialsAvailable": false
    }
  ]
}
```

### TypeScript SDK

```typescript
const result = await sdk.listAgents();

for (const agent of result.agents) {
  console.log(`${agent.id}: ${agent.credentialsAvailable ? "authenticated" : "no credentials"}`);
}
```

## Passing credentials explicitly

Set environment variables before starting Sandbox Agent:

```bash
export ANTHROPIC_API_KEY=sk-ant-...
export OPENAI_API_KEY=sk-...
sandbox-agent daemon start
```

Or with SDK-managed local spawn:

```typescript
import { SandboxAgent } from "sandbox-agent";

const sdk = await SandboxAgent.start({
  spawn: {
    env: {
      ANTHROPIC_API_KEY: process.env.MY_ANTHROPIC_KEY,
    },
  },
});
```
